1.FFmpegとは何ですか
FFmpeg は、デジタル オーディオとビデオの記録、変換、ストリームへの変換に使用できるオープン ソース コンピューター プログラムのセットです。オーディオおよびビデオ データの記録、デコード、エンコード、トランスコード、多重化、逆多重化、フィルタリングなどのための完全なソリューションを提供します。これには、非常に高度なオーディオ/ビデオ コーデック ライブラリである libavcodec が含まれています。
2. オーディオおよびビデオ ファイルの再生プロセス:
映像・音声技術には主に、カプセル化技術、映像圧縮符号化技術、音声圧縮符号化技術が含まれます。ネットワーク伝送を考慮すると、ストリーミング メディア プロトコル テクノロジも含まれます。ビデオ プレーヤーは、ビデオ ファイルを再生するために次の手順を実行する必要があります: プロトコル ソリューション、カプセル化解除、オーディオとビデオのデコード、ビデオとオーディオの同期。基本的なフローチャートは次のとおりです。
ソリューション プロトコル: オーディオとビデオがネットワーク上で送信される場合、さまざまなストリーミング メディア プロトコルがよく使用されます。ソリューション プロトコルの機能は、HTTP や RTMP などのストリーミング メディア プロトコルのデータを、対応する標準カプセル化形式に解析することです。データ。
カプセル化解除:入力されたMP4、TS、FLV、AVIなどのカプセル化形式のデータをオーディオストリーム圧縮符号化データとビデオストリーム圧縮符号化データに分離します。
デコード: ビデオ/オーディオ圧縮符号化データ (オーディオ圧縮符号化規格には AAC、MP3、AC-3 など、ビデオ圧縮符号化規格には H.264、MPEG2 など) を、YUV420P などの非圧縮ビデオ/音声オリジナル データにデコードします。 RGB、PCMデータ。
ビデオとオーディオの同期:デコードされたビデオとオーディオ データを同期し、ビデオとオーディオ データをシステムのグラフィック カードとサウンド カードに送信して再生します。
3. FFmpeg のいくつかのコア構造
AVFormatContext:ファイル名、オーディオおよびビデオ ストリーム、継続時間、ビット レート、その他の情報を含むカプセル化解除関数の構造。
AVCodecContext:コーデック コンテキスト。コーデック タイプ、ビデオの幅と高さ、オーディオ チャネルの数、サンプリング レートなどの情報を含む、エンコードとデコードに使用する必要がある構造。
AVCodec:コーデック情報を格納する構造体。
AVStream:オーディオまたはビデオのストリーム情報を格納する構造。
AVPacket : オーディオまたはビデオのエンコードされたデータを保存します。
AVFrame:オーディオまたはビデオのデコード データ (生データ) を保存します。
4. FFmpegを使用してビデオプロセスを再生します
5. ffmpeg のいくつかの主要な API:
1. すべてのコンテナ形式とデコーダを登録します: av_register_all()
2. 入力ファイルを開いて解凍します: av_open_input_file()
3. ファイルからオーディオおよびビデオ ストリーム情報を取得します: av_find_stream_info()
4. すべてのタイプのストリーム (オーディオ ストリーム、ビデオ ストリーム、字幕ストリーム) を調べて、ビデオ ストリームを見つけます。
5.ビデオ ストリーム内のコーデック コンテキストAVCodecContextを取得します。ビデオのエンコード方法がわかっている場合にのみ、エンコード方法に従ってデコーダを見つけることができます。
6. コーデック コンテキストのコード ID に従って、対応するデコーダーを検索します: avcodec_find_diecoder()
7. コーデックを開きます: avcodec_open2()
8. コード ストリームからメディア フレーム データを継続的に抽出します: av_read_frame()
9. フレームのタイプを決定し、ビデオ フレームをデコードします: vcodec_decode_video2()
10. デコードされたデータをピクセル形式と解像度に変換しますsws_scale()
10. このとき得られるデータは、YUV、RGB、PCMなどのデコードされたオリジナルデータで、fwrite()を使って埋め尽くすように出力したり、バッファ領域outBuffer(1フレーム分のバッファ領域)に適用したりすることができます。自分で適用したターゲット形式)、データを一時的に保存します。
11. デコード後、デコーダを解放します: avcodec_close()
12. 入力ファイルを閉じます: av_close_input_file()
6. SDL を使用してビデオ ストリームを画面に出力します。
SDL は、オープンソースのクロスプラットフォーム マルチメディア開発ライブラリです。SDL は、画像、サウンド、および I/O を制御するためのいくつかの関数を提供します。現在、SDL は主に、ゲーム、エミュレータ、メディア プレーヤーなどのマルチメディア アプリケーションの開発に使用されています。
ffmpeg はビデオ コーデックに使用され、SDL はデコードされたオーディオおよびビデオ データの再生に使用されます。FFmpeg+SDL は、単純なビデオ プレーヤーを実装します。
7. SDL 関数の説明:
SDL_Init(); //インターフェースを初期化し、必要に応じて適切なパラメータを選択します
SDL CreateWindow(); //再生ウィンドウを作成する
SDL_ CreateRenderer() ; //レンダラーを作成する
SDL_ CreateTexture(); //テクスチャを作成
SDL_ UpdateTexture(); //テクスチャパラメータを更新する
SDL_ RenderClear(); //前のフレームのレンダリングをクリアします
SDL_ RenderCopy(); //レンダラーをコピーします
SDL_ RenderCopy(); // 現在のフレームをレンダリングします
8. 各変数の役割を簡単に説明します。
SDL_Window は、SDL を使用するときにポップアップ表示される再生ウィンドウです。
SDL_TextureはYUVテクスチャデータを表示する領域に使用されます。1 つの SDL_Texture は、1 フレームの YUV データに対応します。
SDL_Renderer は、SDL_Texture テクスチャを SDL_Window 再生ウィンドウにレンダリングするために使用されます。
SDL_Rect は、 SDL_Texture によって表示される位置領域を決定するために使用されます。注: SDL_Texture では複数の異なる SDL_Rect を指定できるため、同じコンテンツを SDL_Window の異なる位置に表示できます (SDL_RenderCopy ()関数を使用)。
それらの関係を次の図に示します。
レンダリングプロセス:
オリジナルの FFMPEG+SDL-Knowledge のシンプルなビデオ プレーヤー
★記事末尾の名刺では、オーディオ・ビデオ開発学習教材(FFmpeg、webRTC、rtmp、hls、rtsp、ffplay、srs)やオーディオ・ビデオ学習ロードマップ等を無料で受け取ることができます。
下記参照!