FFMPEG+SDL 用のシンプルなビデオプレーヤー

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)やオーディオ・ビデオ学習ロードマップ等を無料で受け取ることができます。

下記参照!

 

おすすめ

転載: blog.csdn.net/yinshipin007/article/details/132070611