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オーディオおよびビデオストリーミングメディア高度な開発学習ビデオ