我设法用 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, 文件名); AVOutputFormat = AVFormatContext ->oformat; avformat_open_input(&AVFormatContext , 文件名, NULL, NULL)
当我得到我的 AVStream 时,我必须寻求它的结束吗?如何 ?
我必须使用 avio_open(&AVFormatContext->pb, filename, AVIO_FLAG_WRITE); ?
提前致谢。我在样本中一无所获,但如果你有一些样本或想法...... :)