FFMPEG 源碼分析
FFMPEG基本概念:
ffmpeg是一個開源的編解碼框架,它提供了一個音視頻錄制,解碼和編碼庫。FFMPEG是在linux下開發的,但也有windows下的編譯版本。
ffmpeg項目由以下幾部分組成:
ffmpeg 視頻文件轉換命令行工具,也支持經過實時電視卡抓取和編碼成視頻文件.
ffserver 基于HTTP(RTSP正在開發中)用于實時廣播的多媒體服務器.也支持時間平移
ffplay 用 SDL和FFmpeg庫開發的一個簡單的媒體播放器
libavcodec 一個包含了所有FFmpeg音視頻編解碼器的庫.為了保證最優性能和高可復用性,大多數編解碼器從頭開發的.
libavformat 一個包含了所有的普通音視格式的解析器和產生器的庫.
FFMPEG和VLC關系:
在網上很多人都在問FFMPEG和VLC之間是什么關系,網上有位同學的回答最為精辟:“VLC VS FFmpeg == 汽車 VS 發動機”
FFMPEG和libav的關系:
libav是FFMPEG的開發人員中獨立出來一部分后創建的一個新的工程。當時是因為在ffmpeg的開發郵件列表中經常會有不同的意見,并且產生爭論之后獨立出來。同時libav開發組將ffmpeg原有的圖標變為自己的,同時ffmpeg重新開發了圖標:
Today FFmpeg has received the first legal threat in its existence. Its from a previous root admin of FFmpeg, who now is root admin of the Libav fork of FFmpeg. He claims copyright on the zigzag part of our logo. It has to be noted that he said 4 years ago Credit to whoever came up with the zigzag idea
Update May 31/June 1:We have replaced the logo with a better looking one drawn by Hervé Flores.
FFMPEG編譯:
FFMPEG的源碼可以從發下網站中獲取: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中主要分有三個主要用途用于媒體流的解碼播放,媒體流的轉換(解碼之后再編碼)和媒體流錄制。
媒體流的解碼播放
在ffmpeg中媒體流的解碼播放流程如下圖:
其 主要流程為從媒體文件中讀取出媒體流,然后送入媒體格式解碼器(demuxer)中去除多余的外衣--媒體格式。然后送入ffmpeg的codec的 decode中進行解碼,最終生成顯示需要的YUV格式的圖片,然后再送入類似SDL中進行渲染。ffmpeg中媒體流的解碼播放流程相對比較來說其最大 的難點在于pts的同步,在ffmpeg的ffplay中有很好的例子。例子中是啟動了多個線程來進行同步的。
媒體流的轉換
所謂媒體流的轉換分以下幾種情況:
一種是格式轉換,也相當于我們平時的換衣服一樣,只是換個樣式,換一種組織樣式以適應不同場合的需要。
一種是媒體編碼類型的轉換,例如將codec從mpeg4 to H264相當于不同的人來買同一個衣服,雖然外表(格式)看起來一樣但穿衣服的人已經發生了變化。
一種是媒體編碼類型和格式同時轉換,例如將格式為flv的轉換為mpeg4,同時將codec從mpeg4 to H264相當于不同的人穿了不同的衣服。
其流程如下圖:
其數據流前半部分同解碼流程一樣,后半部分則和解碼的流程相反。當解析出YUV圖片之后,然后編碼成另外一種codec,之后再將codec的數據加上一個外殼形成一個媒體文件然后通過byteIocontext寫入目標文件。
媒體流錄制
媒體流的錄制過程相當于媒體流轉換的后半部分流程從YUV文件到media文件。其流程為:
FFMPEG中的decoder的組織形式:
FFMPEG中codec的數據結構如下:
typedef struct AVCodec { const char *name; enum AVMediaType type; enum CodecID id; int priv_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 capabilities; 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;
這個數據結構分別用于decoder和encoder,當被decoder所用時函數指針encode為NULL,而當用于encode時其decode為NULL,在ffmpeg中通過向全局變量
static AVCodec *first_avcodec;
中添加新的codec變量。在查找的過程也是通過遍歷這個鏈表然后通過name來匹配相應的codec這個過程將會在以后的文章中詳細描述。在ffmpeg中formate的組織結構和codec類似。
版權所有:博水。轉載請注明出處:http://www.cnblogs.com/qingquan/