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中媒體流的解碼播放流程如下圖:

decode其主要流程為從媒體文件中讀取出媒體流,然后送入媒體格式解碼器(demuxer)中去除多余的外衣--媒體格式。然后送入ffmpeg的codec的decode中進行解碼,最終生成顯示需要的YUV格式的圖片,然后再送入類似SDL中進行渲染。ffmpeg中媒體流的解碼播放流程相對比較來說其最大的難點在于pts的同步,在ffmpeg的ffplay中有很好的例子。例子中是啟動了多個線程來進行同步的。

媒體流的轉換

所謂媒體流的轉換分以下幾種情況:

一種是格式轉換,也相當于我們平時的換衣服一樣,只是換個樣式,換一種組織樣式以適應不同場合的需要。

一種是媒體編碼類型的轉換,例如將codec從mpeg4 to H264相當于不同的人來買同一個衣服,雖然外表(格式)看起來一樣但穿衣服的人已經發生了變化。

一種是媒體編碼類型和格式同時轉換,例如將格式為flv的轉換為mpeg4,同時將codec從mpeg4 to H264相當于不同的人穿了不同的衣服。

其流程如下圖:

data stream其數據流前半部分同解碼流程一樣,后半部分則和解碼的流程相反。當解析出YUV圖片之后,然后編碼成另外一種codec,之后再將codec的數據加上一個外殼形成一個媒體文件然后通過byteIocontext寫入目標文件。

媒體流錄制

媒體流的錄制過程相當于媒體流轉換的后半部分流程從YUV文件到media文件。其流程為:

recode?

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/


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/454536.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/454536.shtml
英文地址,請注明出處:http://en.pswp.cn/news/454536.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

面試之 Redis匯總

簡介 Redis 持久化機制 RDB(Redis DataBase) AOF(Append-only file) Redis 4.0 對于持久化機制的優化 補充:AOF 重寫 二者的區別 二者優缺點 Memcache與Redis的區別都有哪些? 緩存雪崩、緩存穿透、…

Oracle 10g 問題集錦

監聽服務中Oracle數據庫之中使用最主要的一個服務,但是這個服務經常會出現錯誤,包括以后在工作之中此服務也會出現錯誤,故給出兩種常見錯誤的解決方案(故障1、故障2) 故障1: 注冊表使用了優化軟件(如&#…

iOS linker command failed with exit code 1 (use -v to see invocation)多種解決方案匯總

有時可能會遇到這種錯誤,關鍵是這種錯誤,有時只有這一句話,也不會給更多錯誤信息。 網上找了一些,總結了如下:(PS:以下是按照解決簡易程度排序,不代表出現概率) 1、bitco…

計算機二級python選擇題題庫_2018年計算機二級python題庫精編(1)

1正則中的^符號,用在一對中括號中則表示要匹配() A.字符串的開始 B.除中括號內的其它字符 C.字符串的結束 D.僅中括號內含有的字符 2靜態成員變量稱為類變量,非靜態成員變量稱為實例變量,下列關于一個類的靜態成員的描述中,不正確…

非常好用!世界上最快最好的視頻壓縮轉換工具(精品)

測試了20多款 各種視頻壓縮 截取軟件 真的是這款最快 快好用 效果也好!!! 最快的視頻轉換壓縮工具。 WisMencoder 能夠把您的電腦上的所有視頻格式,包括avi,mpg,rmvb,wmv,mp4,mov,dat等格式以最快的速度和最高的質量轉換為…

面試之 Mysql 匯總

事務相關 什么是事務? 事務:是由一組SQL語句組成的邏輯處理單元,事務具有以下4個屬性,通常簡稱為事務。事務的ACID屬性: (1)原子性(Atomicity):   事務是一…

Exchange Server 2003 部署手冊

1. 環境需求服務器: 域控制器1臺; Exchange Server服務器1臺。 IP和機器名配置: 域控制器:機器名:dc IP: 10.10.10.200 掩碼:255.255.255.0 網關:10.10.10.254 DNS:127.0.0.1 Exchange&#xff…

app中 html5 search 事件,事件 - Cordova中文網

事件Cordova給我們提供了很多的事件,可以在應用程序中使用。應用程序代碼中可以添加這些事件的監聽。例如:HTML文件Device Ready ExampleJS文件// example.js文件// 等待設備API庫加載好//function onLoad() {document.addEventListener("deviceready", o…

python標準庫os中的方法_python中OS常用方法

下面列出了一些在os模塊中比較有用的部分。它們中的大多數都簡單明了。 os.sep可以取代操作系統特定的路徑分隔符。windows下為 “\\” os.name字符串指示你正在使用的平臺。比如對于Windows,它是nt,而對于Linux/Unix用戶,它是posix。 os.get…

ffmpeg 過程分析

簡介 FFmpeg是一個集錄制、轉換、音/視頻編碼解碼功能為一體的完整的開源解決方案。FFmpeg的開發是基于Linux操作系統,但是可以在大多數操作系統中編譯和使用。FFmpeg支持MPEG、DivX、MPEG4、AC3、DV、FLV等40多種編碼,AVI、MPEG、OGG、Matroska、ASF等…

面試之 Python 基礎

1:為什么學習Python 家里有在這個IT圈子里面,也想讓我接觸這個圈子,然后給我建議學的Python,然后自己通過百度和向有學過Python的同學了解了Python,Python這門語言,入門比較簡單,它簡單易學&…

學習筆記(11月08日)--異常

四周三次課(11月8日)異常即是一個事件,該事件會在程序執行過程中發生,影響了程序的正常執行。一般情況下,在Python無法正常處理程序時就會發生一個異常。異常是Python對象,表示一個錯誤。當Python腳本發生異…

html瀏覽器的區別是什么意思,不同瀏覽器對css的識別有區別嗎?

不同瀏覽器對css的識別是有區別,因此針對不同的瀏覽器去寫不同的CSS。下面本篇文章給大家介紹一些常用CSS書寫技巧(不同瀏覽器之間的差異)。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有所幫助。不同的瀏覽器,比如Int…

關于python

你是如何自學 Python 的? https://www.zhihu.com/question/20702054 Python 的練手項目有哪些值得推薦?https://www.zhihu.com/question/29372574 Python編碼規范 -- Python Style Guide http://www.cnblogs.com/lxw0109/p/Python-Style-Guide.htm…

python讀寫文件的文本模式_Python中文件的讀寫、寫讀和追加寫讀三種模式的特點...

本文主要討論一下文件的三種可讀可寫模式的特點及互相之間的區別,以及能否實現修改文件的操作 由于前文已經討論過編碼的事情了,所以這里不再研究編碼,所有打開操作默認都是utf-8編碼(Linux系統下) 首先我們看r(讀寫&a…

html顏色疊加代碼,html代碼大全(基礎使用代碼)(顏色代碼完整版)

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓您在使用以下基礎使用代碼時請把{}換成<>&#xff01;&#xff01;&#xff01;)(這樣這個命令才成立&#xff01;&#xff01;&#xff01;)基礎使用代碼&#xff1a;1)貼圖&#xff1a;{img src"圖片地址"}2)加入…

如何看懂源代碼

如何看懂源代碼--(分析源代碼方法) 【轉載】 由于今日計劃著要看Struts 開源框架的源代碼 昨天看了一個小時稍微有點頭緒,可是這個速度本人表示非常不滿意,先去找了下資料, 覺得不錯... 摘自(繁體中文Traditional Chinese):http://www.ithome.com.tw/itadm/article.php?c477…

面試之 Python 進階

前端相關 1.談談你對http協議的認識。 瀏覽器本質&#xff0c;socket客戶端遵循Http協議   HTTP協議本質&#xff1a;通過\r\n分割的規范 請求響應之后斷開鏈接 > 無狀態、 短連接 具體&#xff1a;   Http協議是建立在tcp之上的&#xff0c;是一種規范&#xff0c;它…

Lync Server外部訪問系列PART5:模擬公網DNS

因為要實現外部用戶訪問&#xff0c;所以我們必然需要在公網DNS中添加我們所需要的一些A記錄&#xff0c;而這樣的測試需要我們擁有一個公網的域名以及一個可發布、可訪問的IP。如果沒有的話就沒辦法這樣測試&#xff0c;所以我們今天在物理局域網中搭建一臺DNS服務器&#xff…

C語言運算符和表達式

參考鏈接&#xff1a;http://blog.csdn.net/qq_31059475/article/details/51195091 概述 C語言一共有34種運算符&#xff0c;10種運算類型&#xff1a;算術運算符&#xff08;、-、*、/、%&#xff09;、關系運算符&#xff08;>、>、、&#xff01;、<、<&#xf…