1

2 つの異なるソースからの 2 つのビデオ ストリームによって生成されたビデオ ファイルを保存する必要があります。私は tcp/ip 経由で rtsp を使用しており、ビデオは h264 でエンコードされています。最初に最初のソースからビデオを録画してから、2 番目のソースを続行する必要があります。だから私が試したのは、2つの AVFormatContext インスタンスを宣言し、両方を初期化してavformat_open_input(&context, "rtsp://......",NULL,&options) からフレームを読み取りav_read_frame(context,&packet) 、ビデオファイルに書き込むことav_write_frame(oc,&packet); でした。最初のソースからビデオを保存するとうまくいきますが、例として、最初のコンテキストからyフレームを保存した場合、同じファイルの2番目のコンテキストからフレームを読み取って保存しようとすると、保存しようとしている最初のyフレームav_write_frame(oc,&packet2); に対して -22 が返され、フレームがファイルに追加されません。

問題は、コンテキスト変数が読み取られたフレームの数を記憶しており、すべての読み取りパケットに識別番号を与えて、2 回書き込まれないようにすることだと思います。しかし、これらの識別番号がリセットされた新しいコンテキストを使用している場合、AVOutputFormat または AVFormatContext は、受け取る予定のパッケージの ID も保持し、その ID を持つパッケージを受け取るまで何も書き込みません。どうしたらこの不便さを解消できるか、今考えています。そのIDのセッター、または同じコンテキストを再利用する方法が見つかりません。ffmpeg のソースを変更しようと思ったのですが、かなり複雑で、探しているものが見つかりませんでした。別の方法は、2 つのビデオを 2 つの異なるファイルに保存することですが、後でそれらを追加する方法がわかりません。ffmpeg は mpeg でエンコードされたビデオのみを追加でき、ビデオのレンコーディングは時間がかかるため、実際にはオプションではありません。また、h264 でエンコードされた 2 つの mp4 ビデオを追加する他の機能的な方法が見つかりませんでした。

この問題に対するあらゆる種類の有用なアイデアを喜んで聞きます。

4

1 に答える 1

1

生の h.264 ストリームを保存している場合、単純に 2 つの別々のストリームを保存してから、システム コマンド system("cat file1 file2 > finalfile") を使用して、コマンド ラインでファイル チャンクを別々に連結しないのはなぜですか。

出力が次のいずれかの場合、cat を使用して直接追加できます

  1. 同じコーデックのトランスポート ストリーム [ts]
  2. .mpg ファイル
  3. 生の h.264 ファイル
  4. まったく同じエンコーディング ヘッダーを持つ生の mpeg4 ファイル [ヘッダーに記載されているサイズ、プロファイル、ツールセットと同じ]
  5. H.263 ストリーム

mp4 ファイルまたは 3gpp ファイルを直接連結することはできません。

于 2012-10-08T09:50:16.280 に答える