2

我设法用 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); ?

提前致谢。我在样本中一无所获,但如果你有一些样本或想法...... :)

4

0 回答 0