FFMPEGソースコード分析



Ffmpeg Source Code Analysis



FFMPEGの基本概念:

Ffmpegは、オーディオとビデオの記録、デコード、およびエンコードのライブラリを提供するオープンソースのコーデックフレームワークです。 FFMPEGはLinuxで開発されていますが、Windowsでコンパイルされたバージョンもあります。
ffmpegプロジェクトは次のセクションで構成されています。
ffmpegビデオファイル変換コマンドラインツールは、リアルタイムTVカードのキャプチャとビデオファイルへのエンコードもサポートします。
ffserverは、マルチメディアサーバーのリアルタイムブロードキャスト用のHTTP(RTSPは開発中)に基づいています。タイムシフトもサポート
ffplaySDLおよびFFmpegライブラリで開発されたシンプルなメディアプレーヤー
libavcodecすべてのFFmpegオーディオおよびビデオコーデックを含むライブラリ。最適なパフォーマンスと高い再利用性を確保するために、ほとんどのコーデックはゼロから開発されています。
libavformatすべての通常のオーディオおよびビデオ形式を含むパーサーおよびジェネレーターのライブラリ。

FFMPEGとVLCの関係:

インターネット上の多くの人々は、FFMPEGとVLCの関係は何かと尋ねています。オンラインの学生の1人が最も見事に答えました: 'VLC VS FFmpeg ==車VSエンジン'
FFMPEGとlibavの関係:
libavは、FFMPEG開発者によって作成された新しいプロジェクトです。当時、ffmpeg開発メーリングリストは意見が違うことが多かったため、紛争後に独立しました。同時に、libav開発チームはffmpegの元のアイコンを独自のものに変更し、ffmpegはアイコンを再開発しました。



今日、FFmpegはその存在の中で最初の法的脅威を受けました。 FFmpegの以前のルート管理者からのもので、現在はFFmpegのLibavフォークのルート管理者です。彼は私たちのロゴのジグザグ部分の著作権を主張しています。彼が4年前に言ったことに注意する必要がありますジグザグのアイデアを思いついた人へのクレジット

5月31日/ 6月1日更新:ロゴをエルヴェフローレスが描いた見栄えの良いロゴに置き換えました。



FFMPEGコンパイル:

FFMPEGのソースコードは、次のWebサイトから入手できます。 http://www.ffmpeg.org/。
コンパイルオプションは、ソースコードのconfigureを介して構成できます。
libfaac、libx264などの外部委託パッケージを構成する場合は、-extra-cflagsを使用してヘッダーファイルのフォルダーを指定できます。サードパーティのライブラリファイルの場所は、-extra-cflagsで指定できます。ダイナミックライブラリをコンパイルする場合は、-enable-shared構成オプションを使用できます。
ffplayをコンパイルする場合は、最初にSDLライブラリをインストールする必要があります。そうしないと、ffplayをコンパイルできません。
SDLライブラリのコンパイルは、他のLinuxのインストールファイルと同じです。
サードパーティライブラリのインストールについては、どこでも説明されています。

http://www.cnblogs.com/MaxIE/archive/2007/02/03/638863.html

参考までにここに記事があります。



著作権:波水。ソースを示してください: http://www.cnblogs.com/qingquan/

Ffmpegソース分析データストリーム http://www.yanfake.com

この記事では主にffmpegのデータフローを紹介します。 ffmpegには、メディアストリームのデコードと再生、メディアストリームの変換(デコード後の再コーディング)、およびメディアストリームの記録の3つの主な用途があります。

メディアストリームのデコードと再生

ffmpegでのメディアストリームのデコードと再生のプロセスは次のとおりです。

デコード主なプロセスは、メディアファイルからメディアストリームを読み取り、それをメディアフォーマットデコーダー(デマルチプレクサ)に送信して、余分なコートメディアフォーマットを削除することです。次に、それをffmpegのコーデックデコードに送信してデコードし、最後に目的のYUV形式の画像を生成してから、SDLのようなレンダリングに送信します。 ffmpegでメディアストリームの再生プロセスをデコードする際の最大の難しさは、ptsの同期です。 ffmpegのffplayには良い例があります。この例では、同期のために複数のスレッドが開始されています。

メディアストリーム変換

いわゆるメディアストリーム変換は、次の場合に分けられます。

1つはフォーマット変換です。これは通常の着替えに相当し、スタイルを変更するだけで、さまざまな場面のニーズに合わせて組織のスタイルを変更します。

1つは、メディアエンコーディングタイプの変換です。たとえば、コーデックはmpeg4からH264までのさまざまな人が同じ服を購入するのと同じですが、外観(形式)は同じに見えますが、服を着ている人は変わっています。

1つは、メディアのエンコードタイプとフォーマットを同時に変換することです。たとえば、フォーマットをflmpからmpeg4に変換すると同時に、コーデックをmpeg4からH264に、さまざまな服を着ているさまざまな人に着用します。

プロセスは次のとおりです。

データストリームデータストリームの前半はデコードプロセスと同じで、後半はデコードプロセスの逆です。 YUV画像を解析した後、別のコーデックにエンコードされ、コーデックデータがシェルに追加されてメディアファイルが形成され、byteIocontextを介してターゲットファイルに書き込まれます。

メディアストリームの記録

メディアストリームの記録プロセスは、YUVファイルからメディアファイルへのメディアストリーム変換の後半のフローに相当します。プロセスは次のとおりです。

再コーディング

FFMPEGでのデコーダーの構成:

FFMPEGのコーデックのデータ構造は次のとおりです。

typedef struct AVCodec {
const char * name
列挙型AVMediaTypeタイプ
列挙型CodecIDID
intpriv_data_size
int(* init)(AVCodecContext *)
int(* encode)(AVCodecContext *、uint8_t * buf、int buf_size、void * data)
int(* close)(AVCodecContext *)
int(* decode)(AVCodecContext *、void * outdata、int * outdata_size、AVPacket * avpkt)
int機能
struct AVCodec * next
void(* flush)(AVCodecContext *)
const AVRational * supported_framerates
const enum PixelFormat * pix_fmts
const char * long_name
const int * supported_samplerates
const enum SampleFormat * sample_fmts
const int64_t * channel_layouts
} AVCodec

このデータ構造は、デコーダーとエンコーダーにそれぞれ使用されます。デコーダーで使用する場合、関数ポインターはNULLをエンコードし、エンコードに使用する場合、そのデコードはNULLであり、ffmpegではグローバル変数に渡されます。

静的AVCodec * first_avcodec;

新しいコーデック変数を追加します。検索のプロセスは、リストをトラバースし、対応するコーデックを名前で照合することによっても実行されます。このプロセスについては、今後の記事で詳しく説明します。 ffmpegのギ酸塩の構造はコーデックに似ています。

著作権:波水。ソースを示してください: http://www.cnblogs.com/qingquan/