FFmpeg 4.2 音频解码
static void decode(AVCodecContext *dec_ctx, AVPacket *pkt, AVFrame *frame,
FILE*outfile)
{
inti, ch;
intret, data_size;
/* send the packet with the compressed data to the decoder */
ret =avcodec_send_packet(dec_ctx, pkt);
if(ret <0) {
fprintf(stderr, "Error submitting the packet to the decoder\n");
//exit(1);
}
/* read all the output frames (in general there may be any number of them */
while(ret >=0) {
ret =avcodec_receive_frame(dec_ctx, frame);
if(ret ==AVERROR(EAGAIN) || ret ==AVERROR_EOF)
return;
elseif(ret <0) {
fprintf(stderr, "Error during decoding\n");
//exit(1);
}
data_size =av_get_bytes_per_sample(dec_ctx->sample_fmt);
if(data_size <0) {
/* This should not occur, checking just for paranoia */
fprintf(stderr, "Failed to calculate data size\n");
//exit(1);
}
for(i =0; i < frame->nb_samples; i++)
for(ch =0; ch < dec_ctx->channels; ch++)
fwrite(frame->data[ch] + data_size*i,1, data_size, outfile);
}
}
//音频解码
int ffmpegVideoToAudio1(const char *src_fileName, const char *dst_fileName) {
constchar*outfilename, *filename;
constAVCodec*codec;
AVCodecContext *c= NULL;
AVCodecParserContext *parser = NULL;
intlen, ret;
FILE*f, *outfile;
uint8_t inbuf[AUDIO_INBUF_SIZE + AV_INPUT_BUFFER_PADDING_SIZE];
uint8_t*data;
size_t data_size;
AVPacket*pkt;
AVFrame*decoded_frame =NULL;
filename = src_fileName;
outfilename = dst_fileName;
pkt =av_packet_alloc();
/* find the MPEG audio decoder */
codec =avcodec_find_decoder(AV_CODEC_ID_MP2);
if(!codec) {
fprintf(stderr, "Codec not found\n");
//exit(1);
}
parser =av_parser_init(codec->id);
if(!parser) {
fprintf(stderr, "Parser not found\n");
//exit(1);
}
c =avcodec_alloc_context3(codec);
if(!c) {
fprintf(stderr, "Could not allocate audio codec context\n");
//exit(1);
}
/* open it */
if(avcodec_open2(c, codec,NULL) <0) {
fprintf(stderr, "Could not open codec\n");
//exit(1);
}
f =fopen(filename,"rb");
if(!f) {
fprintf(stderr, "Could not open %s\n", filename);
//exit(1);
}
outfile =fopen(outfilename,"wb");
if(!outfile) {
av_free(c);
//exit(1);
}
/* decode until eof */
data = inbuf;
data_size =fread(inbuf,1,AUDIO_INBUF_SIZE, f);
while(data_size >0) {
if(!decoded_frame) {
if(!(decoded_frame =av_frame_alloc())) {
fprintf(stderr, "Could not allocate audio frame\n");
//exit(1);
}
}
ret =av_parser_parse2(parser, c, &pkt->data, &pkt->size,
data, data_size,
AV_NOPTS_VALUE,AV_NOPTS_VALUE,0);
if(ret <0) {
fprintf(stderr, "Error while parsing\n");
exit(1);
}
data += ret;
data_size -= ret;
if(pkt->size)
decode(c, pkt, decoded_frame, outfile);
if(data_size
memmove(inbuf, data, data_size);
data = inbuf;
len =fread(data + data_size,1,
AUDIO_INBUF_SIZE- data_size, f);
if(len >0)
data_size += len;
}
}
/* flush the decoder */
pkt->data=NULL;
pkt->size=0;
decode(c, pkt, decoded_frame, outfile);
fclose(outfile);
fclose(f);
avcodec_free_context(&c);
av_parser_close(parser);
av_frame_free(&decoded_frame);
av_packet_free(&pkt);
return 0;
}