1. ホーム

av_write_frame および av_interleaved_write_frame

2022-02-25 06:51:22

1. 機能の紹介

av_interleaved_write_frame関数の紹介です。

  1. /**
  2.  * パケットを出力メディアファイルへ書き込む。
  3. <スパン <スパン  *
  4.  * この関数は、必要に応じてパケットを内部でバッファリングして
  5.  * 出力ファイルのパケットは、以下の順序で適切にインターリーブされています。
  6. <スパン  * 独自のインターリーブを行う呼び出し元は、以下のように呼び出す必要があります。
  7.  * この関数の代わりに、av_write_frame() を使用します。
  8. <スパン  *
  9.  * @param s メディアファイルハンドル
  10.  * @param pkt 書き込むべきデータを含むパケット。
  11. <スパン  * <br>
  12.  * パケットが参照カウントされている場合、この関数は
  13.  * この参照は所有権を持ち、後で
  14. <スパン  * フィットする。
  15.  * 呼び出し元は、この参照を通じてデータにアクセスしてはならない。
  16.  * パケットが参照カウントされていない場合、この関数が返されます。
  17.  * libavformatはコピーを作成します。
  18. <スパン  * <br>
  19.  * このパラメータはNULLでも構いません。
  20.  * インターリーブキューをフラッシュします。
  21. <スパン  * <br>
  22.  * パケットの @ref AVPacket.stream_index "stream_index" フィールドは、必ず
  23.  * の対応するストリームのインデックスに設定されます。
  24.  * AVFormatContext.streams "s->streams". これは、非常に強く
  25.  * タイミング情報(@ref AVPacket.pts "pts", @ref)を推奨します。
  26.  * AVPacket.dts "dts", @ref AVPacket.duration "duration") にセットされます。
  27.  * 正しい値です。
  28. <スパン  *
  29.  * 成功すれば 0 を、エラーなら負の AVERROR を返します。
  30.  * この関数が失敗した場合でも、パケットを解放する処理を行います。
  31. <スパン  *
  32.  * @see av_write_frame(), AVFormatContext.max_interleave_delta
  33. <スパン  */
  34. int  av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt);  

av_write_frame関数の紹介です。

  1. /**
  2.  * パケットを出力メディアファイルへ書き込む。
  3. <スパン  *
  4.  * この関数は、パケットをバッファリングすることなく直接 Muxer に渡します。
  5.  * 呼び出し元は、以下のように正しくインターリーブする責任があります。
  6. <スパン  * libavformatにパケットを処理させたい呼び出し元は、以下のようになります。
  7.  * インターリーブは、この代わりに av_interleaved_write_frame() を呼び出す必要があります。
  8.  * 機能です。
  9. <スパン  *
  10.  * @param s メディアファイルハンドル
  11.  * @param pkt 書き込むべきデータを含むパケット。
  12.  * av_interleaved_write_frame()では、この関数では
  13.  * 渡されたパケットの所有権(ただし、一部のMuxerでは
  14.  * 入力パケットへの内部参照)。
  15. <スパン  * <br>
  16.  * このパラメータは、NULLでも構いません(最後だけでなくいつでも)。
  17.  * Muxer 内にバッファリングされたデータを即座にフラッシュするため。
  18.  * に書き込む前に、内部でデータをバッファリングするミューサーです。
  19.  * 出力されます。
  20. <スパン  * <br>
  21.  * パケットの @ref AVPacket.stream_index "stream_index" フィールドは、必ず
  22.  * の対応するストリームのインデックスに設定されます。
  23.  * AVFormatContext.streams "s->streams". これは、非常に強く
  24.  * タイミング情報(@ref AVPacket.pts "pts", @ref)を推奨します。
  25.  * AVPacket.dts "dts", @ref AVPacket.duration "duration") にセットされます。
  26.  * 正しい値です。
  27.  * エラーが発生した場合は 0 を、OK の場合は = 0 を、フラッシュされてもうフラッシュするデータがない場合は 1 を返します。
  28. <スパン  *
  29.  * @see av_interleaved_write_frame()
  30. <スパン  */
  31. int  av_write_frame(AVFormatContext *s, AVPacket *pkt);  

2. 機能呼び出し図

av_interleaved_write_frame 関数呼び出しの図。


av_write_frame 関数呼び出しの図。



3. 機能コード

av_interleaved_write_frameのファンクションコードです。

  1. イント  av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt)  
  2. <スパン {  
  3. int  ret, flush = 0;  
  4. //pktが合法かどうかをチェックする
  5.     ret = check_packet(s, pkt);  
  6. もし  (ret < 0)  
  7. <スパン 行く  を失敗させる。  
  8. <スパン もし <スパン  (pkt) {  
  9.         AVStream *st = s->streams[pkt->stream_index];  
  10.         av_dlog(s,  "av_interleaved_write_frame size:%d dts:%s pts:%s\n" ,  
  11.                 pkt->size, av_ts2str(pkt->dts), av_ts2str(pkt->pts));  
  12. <スパン もし  ((ret = compute_pkt_fields2(s, st, pkt)) < 0 && ! (s->oformat->flags & AVFMT_NOTIMESTAMPS)) // pts、dts、durationの計算とチェック
  13. 行く  を失敗させる。  
  14. <スパン もし  (pkt->dts == AV_NOPTS_VALUE && ! (s->oformat->flags & AVFMT_NOTIMESTAMPS)) {。  
  15.             ret = AVERROR(EINVAL)。  
  16. 行く  を失敗させる。  
  17.         }  
  18.     }  さもなければ  {  
  19. <スパン         av_dlog(s,  "av_interleaved_write_frame FLUSHn" );  
  20.         フラッシュ = 1;  
  21.     }  
  22. <スパン について  (;; ) {  
  23.         AVPacket opkt;  
  24. int  ret = interleave_packet(s, &opkt, pkt, flush);  
  25. もし <スパン  (pkt) {  
  26.             memset(pkt, 0,  サイズオブ (*pkt))のようになります。  
  27.             av_init_packet(pkt);  
  28.             pkt = NULL。  
  29.         }