FFmpeg:将输入音频文件转换为MP4容器中的AAC(附完整源代码)

FFmpeg:将输入音频文件转换为MP4容器中的AAC

#include 
#include "libavformat/avformat.h"
#include "libavformat/avio.h"#include "libavcodec/avcodec.h"#include "libavutil/audio_fifo.h"
#include "libavutil/avassert.h"
#include "libavutil/avstring.h"
#include "libavutil/channel_layout.h"
#include "libavutil/frame.h"
#include "libavutil/opt.h"#include "libswresample/swresample.h"/* The output bit rate in bit/s */
#define OUTPUT_BIT_RATE 96000
/* The number of output channels */
#define OUTPUT_CHANNELS 2/*** Open an input file and the required decoder.* @param      filename             File to be opened* @param[out] input_format_context Format context of opened file* @param[out] input_codec_context  Codec context of opened file* @return Error code (0 if successful)*/
static int open_input_file(const char *filename,AVFormatContext **input_format_context,AVCodecContext **input_codec_context)
{AVCodecContext *avctx;const AVCodec *input_codec;const AVStream *stream;int error;/* Open the input file to read from it. */if ((error = avformat_open_input(input_format_context, filename, NULL,NULL)) < 0) {fprintf(stderr, "Could not open input file '%s' (error '%s')\n",filename, av_err2str(error));*input_format_context = NULL;return error;}/* Get information on the input file (number of streams etc.). */if ((error = avformat_find_stream_info(*input_format_context, NULL)) < 0) {fprintf(stderr, "Could not open find stream info (error '%s')\n",av_err2str(error));avformat_close_input(input_format_context);return error;}/* Make sure that there is only one stream in the input file. */if ((*input_format_context)->nb_streams != 1) {fprintf(stderr, "Expected one audio input stream, but found %d\n",(*input_format_context)->nb_streams);avformat_close_input(input_format_context);return AVERROR_EXIT;}stream = (*input_format_context)->streams[0];/* Find a decoder for the audio stream. */if (!(input_codec = avcodec_find_decoder(stream->codecpar->codec_id))) {fprintf(stderr, "Could not find input codec\n");avformat_close_input(input_format_context);return AVERROR_EXIT;}/* Allocate a new decoding context. */avctx = avcodec_alloc_context3(input_codec);if (!avctx) {fprintf(stderr, "Could not allocate a decoding context\n");avformat_close_input(input_format_context);return AVERROR(ENOMEM);}/* Initialize the stream parameters with demuxer information. */error = avcodec_parameters_to_context(avctx, stream->codecpar);if (error < 0) {avformat_close_input(input_format_context);avcodec_free_context(&avctx);return error;}/* Open the decoder for the audio stream to use it later. */if ((error = avcodec_open2(avctx, input_codec, NULL)) < 0) {fprintf(stderr, "Could not open input codec (error '%s')\n",av_err2str(error));avcodec_free_context(&avctx);avformat_close_input(input_format_context);return error;}/* Set the packet timebase for the decoder. */avctx->pkt_timebase = stream->time_base;/* Save the decoder context for easier access later. */*input_codec_context = avctx;return 0;
}/*** Open an output file and the required encoder.* Also set some basic encoder parameters.* Some of these parameters are based on the input file's parameters.* @param      filename              File to be opened* @param      input_codec_context   Codec context of input file* @param[out] output_format_context Format context of output file* @param[out] output_codec_context  Codec context of output file* @return Error code (0 if successful)*/
static int open_output_file(const char *filename,AVCodecContext *input_codec_context,AVFormatContext **output_format_context,AVCodecContext **output_codec_context)
{AVCodecContext *avctx          = NULL;AVIOContext *output_io_context = NULL;AVStream *stream               = NULL;const AVCodec *output_codec    = NULL;int error;/* Open the output file to write to it. */if ((error = avio_open(&output_io_context, filename,AVIO_FLAG_WRITE)) < 0) {fprintf(stderr, "Could not open output file '%s' (error '%s')\n",filename, av_err2str(error));return error;}/* Create a new format context for the output container format. */if (!(*output_format_context = avformat_alloc_context())) {fprintf(stderr, "Could not allocate output format context\n");return AVERROR(ENOMEM);}/* Associate the output file (pointer) with the container format context. */(*output_format_context)->pb = output_io_context;/* Guess the desired container format based on the file extension. */if (!((*output_format_context)->oformat = av_guess_format(NULL, filename,NULL))) {fprintf(stderr, "Could not find output file format\n");goto cleanup;}if (!((*output_format_context)->url = av_strdup(filename))) {fprintf(stderr, "Could not allocate url.\n");


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部