我设法使用libavformat实现我的解码和编码音频类。 我可以创建和阅读mp3,ogg,......
现在,我想添加一个“在现有音频文件末尾录制”的功能。 即:在现有流的末尾添加一些新的音频数据帧(音频数据)。 (我的文件只是带有1和唯一流的音频文件)。
总结一下,我对此没有成功:
av_register_all();
avformat_open_input(&AVFormatContext , filename, NULL, NULL)
avformat_find_stream_info(AVFormatContext , NULL)
audio_stream_idx = av_find_best_stream(AVFormatContext , AVMEDIA_TYPE_AUDIO, -1, -1, NULL, 0);
AVStream = AVFormatContext ->streams[audio_stream_idx_];
AVCodec = avcodec_find_encoder(AVStream->codec->codec_id);
avcodec_open2(AVStream->codec, AVCodec, NULL);
AVFrame = avcodec_alloc_frame();
...
loop
{ avcodec_encode_audio2(AVStream->codec, &AVPacket, AVFrame, &got_packet_);
av_write_frame(AVFormatContext, &AVPacket);
}
...
它在第一个av_write_frame上崩溃了。
我看到了3个可能的原因,但我不知道该怎么做:
输入和输出文件相同。我应该如何初始化AVFormatContext和AVOutputFormat?
avformat_alloc_output_context2(& AVFormatContext,NULL,NULL,filename); AVOutputFormat = AVFormatContext - > oformat; avformat_open_input(& AVFormatContext,filename,NULL,NULL)
当我获得AVStream时,我是否必须寻求结束?怎么样 ?
我是否必须使用avio_open(& AVFormatContext-> pb,filename,AVIO_FLAG_WRITE); ?
提前致谢。 我在样本中没有发现任何相关内容,但如果你有一些样本或想法...... :)