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