1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > FFmpeg:将输入音频文件转换为MP4容器中的AAC(附完整源代码)

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

时间:2021-02-27 19:02:31

相关推荐

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

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

#include <stdio.h>#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.* @paramfilename 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 files parameters.* @paramfilename File to be opened* @paraminput_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");

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。