#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 */#defineOUTPUT_BIT_RATE96000/* The number of output channels */#defineOUTPUT_CHANNELS2/*** 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)*/staticintopen_input_file(constchar*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);returnAVERROR(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;return0;}/*** 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)*/staticintopen_output_file(constchar*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");returnAVERROR(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");