FFmpeg学習:FFmpeg学習の要約

1.FFmpegがビデオを再生する基本的なプロセス

再生プロセス:video.avi(Container)-> Open to get Video_Stream-> Read Packet-> Parse to Frame-> DisplayFrame。

  • コンテナ:オーディオとビデオのコンテナは、通常、特定のファイル形式(AVI / QTなど)を指し、含まれるオーディオ、ビデオ、字幕、およびその他の関連情報を指定します。

  • ストリーム:メディアストリーム。サウンド、ビデオ、字幕データなど、時間軸上の連続データを指します。

  • パケット:ストリーム内の生データには、アプリケーションでの最終操作に便利なフレームにデコードできる元のデータが含まれています。

  • フレーム:ストリーム内のデータユニット。

  • コーデック:DivxやMP3などのコーデック(Code and Decode)は、圧縮データと元のデータをフレーム単位で相互変換することを実現します。

2、FFmpegの各構造と関連するメソッドフローソーティング

1. AVCodec

AVCodec-リンクリストによって維持されるコーデックは、それぞれに対応する名前、タイプ、コーデックID、およびデータ処理用のコーデック関数ポインタを持っています。

  • avcodec_find_decoder / avcodec_find_encoder:指定されたコーデックIDまたはデコーダー名に従ってシステムを検索し、AVCodec構造体へのポインターを返します

  • avcodec_alloc_context3:AVCodecに従って適切なAVCodecContextを割り当てます

  • avcodec_open / avcodec_open2 / avcodec_close:指定されたAVCodecに従って対応するコーデックを開き、AVCodecContextを初期化/コーデックを閉じます

  • avcodec_alloc_frame:コーデックに必要なAVFrame構造を割り当てます

  • avcodec_decode_video / avcodec_decode_video2:ビデオフレームをデコードし、入力データはAVPacket構造体にあり、出力データはAVFrame構造体にあります

  • avcodec_decode_audio4:オーディオフレームをデコードします。入力データはAVPacket構造体にあり、出力データはAVFrame構造体にあります。

  • avcodec_encode_video / avcodec_encode_video2:ビデオフレームをエンコードし、入力データはAVFrame構造体にあり、出力データはAVPacket構造体にあります。

2. AVCodecContext

AVCodecContext-特定のメディアデータに関連するコーデックコンテキスト、AVCodecポインターとコーデック関連データを保存し、ストリームで使用されるコーデックに関するすべての情報を含みます

  • codec_name [32]、codec_type(AVMediaType)、codec_id(CodecID)、codec_tag:コーデック名、タイプ(オーディオ/ビデオ/字幕など)、ID(H264 / MPEG4など)、FOURCおよびその他の情報

  • hight / width、coded_width / coded_height:ビデオ的高宽

  • sample_fmt:オーディオの元のサンプル形式。これはSampleFormat列挙です。

  • time_base:スコア(den / num)を使用してフレームレート情報を保存します

3.AVFrame

  • データ/ラインサイズ:FFMpegは、元の画像データを平面的に内部に保存します。つまり、画像のピクセルは複数の平面(R / G / BまたはY / U / V)配列に分割されます。

  • データ配列:ポインターは各ピクセル平面の開始位置を指し、ユーザーはエンコード中にデータを設定する必要があります

  • linesize array:各プレーンを格納するための各バッファの線幅を格納します。ユーザーはエンコード時にデータを設定する必要があります

  • key_frame:画像がキーフレームであるかどうか、libavcodecによって設定されます

  • pict_type:画像のエンコードタイプ:Intra(1)/ Predicted(2)/ Bi-dir(3)など。デフォルト値はNONE(0)で、その値はlibavcodecによって設定されます。

  • pts:プレゼンテーション時間、エンコード中にユーザーが設定

  • 品質:1(最高)からFF_LAMBDA_MAX(256 * 128-1、最低)まで、エンコード中にユーザーが設定します。デフォルト値は0です。

  • nterlaced_frame:インターレースされているかどうかを示し、エンコード中にユーザーが指定します。デフォルトは0です。

4. AVFormatContext

AVFormatContext-入出力機能を実現し、フォーマット変換プロセス中に関連データを保存し、メディアファイルまたはメディアストリームの構成と基本情報を記述する主要な構造

  • nb_streams / streams:すべての埋め込みメディアストリームの説明を含むAVStream構造体ポインターの配列。入力と出力のファイル形式を示すために、内部にAVInputFormat + AVOutputFormat構造体があります。

  • avformat_open_input:いくつかの値を作成して初期化しますが、他のいくつかの値(mux_rate、keyなど)は手動で初期値を設定する必要があります。そうしないと、例外が発生する可能性があります

  • avformat_alloc_output_context2:ファイルの出力形式、拡張子、またはファイル名に従って、適切なAVFormatContext構造を割り当てます。

5.AVPacket

AVPacket-デコード前にメディアデータ(オーディオ/ビデオフレーム、字幕パッケージなど)と追加情報(タイムスタンプのデコード、表示タイムスタンプ、期間など)を一時的に保存します。これは、主にバッファーの作成とデータの読み込みに使用されます。

  • data / size / pos:メディアストリームのデータバッファポインタ、長さ、バイトオフセット

  • フラグ:フラグフィールドの組み合わせ、1(AV_PKT_FLAG_KEY)はデータがキーフレームであることを示し、2(AV_PKT_FLAG_CORRUPT)はデータが破損していることを示します

  • destruct:データバッファを解放するための関数ポインタ。その値は[av_destruct_packet] / av_destruct_packet_nofreeで、av_free_packetによって呼び出されます。

6.AVStream

AVStream-メディアストリームを記述します。その情報のほとんどは、ファイルヘッダー情報に従ってavformat_open_inputによって決定できます。その他の情報は、avformat_find_stream_infoによって取得できます。通常、ビデオストリーム、中国語と英語のオーディオストリーム、中国語と英語の字幕ストリーム(字幕)、これは、av_new_stream、Avformat_new_streamなどを渡すことができます。

  • index:AVFormatContext内のストリームのインデックス。その値は自動的に生成されます(AVFormatContext :: streams [index])

  • nb_frames:ストリーム内のフレーム数

  • time_base:実数であるストリームのタイムベース。ストリーム内のメディアデータのptsとdtsは、このタイムベースを粒度として使用します。通常、av_rescale / av_rescale_qを使用すると、さまざまなタイムベースの変換を実現できます。

  • avformat_find_stream_info:必要なコーデックパラメータ(AVMediaType、CodecIDなど)を取得し、AVFormatContext :: streams [i] :: codecに設定します。

  • av_read_frame:マルチメディアファイルまたはマルチメディアストリームからメディアデータを読み取り、取得したデータはAVPacketに保存されます

  • av_seek_frame:メディアファイルの読み取りおよび書き込みポインタを変更して、メディアファイルへのランダムアクセスを実現します。通常、時間、ファイルオフセット、およびフレーム番号に基づくランダムアクセスをサポートします(AVSEEK_FLAG_FRAME)

3つ、FFmpeg学習チュートリアルとリソース編成

FFmpegビデオ+オーディオおよびビデオ学習教材AdvancedDevelopment qun:学習教材をクリックし、FFmpeg情報に注意してください。

オーディオおよびビデオ開発学習ビデオリンク:FFmpeg / WebRTC / RTMPオーディオおよびビデオストリーミングメディア高度な開発学習ビデオ

 

おすすめ

転載: blog.csdn.net/Linuxhus/article/details/113865019