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); を使用する必要がありますか? ?
前もって感謝します。それについてのサンプルには何も見つかりませんでしたが、サンプルやアイデアがあれば... :)