1. 程式人生 > >對FFMPEG的小總結(自己看的)

對FFMPEG的小總結(自己看的)

這篇文章是我自己看的,你未必能看懂,當做我自己的備份。

FFmpeg是複雜的開源系統,剛開始玩只知道用命令ffmpeg -i test.mp4 這樣的。其實普通使用者能有用這個命令ffmpeg和FFmpeg框架是有區別的。

其實ffmpeg這個命令是一個程式,程式碼是FFmpeg的根目錄ffmpeg.c編譯出來的。這個ffmpeg.c呼叫了FFmpeg框架libavformat,libavcodec,libavfilters,libavutil的API,實現了對命令 ffmpeg -i test.mp4的解析。同理,ffplay其實是ffplay.c編譯出來的,它呼叫了FFmpeg框架和SDL進行編譯,FFmpeg作為編解碼庫,然後SDL作為顯示渲染YUV。

所以FFmpeg框架是不包含ffmpeg.c,fflpay,ffserver等這些的。你可以把它們當做使用FFmpeg框架的案例!

如果我們自己要寫程式碼進行解析mp4為YUV,進行濾鏡處理,進行分離音訊,以及合成MP4等,那麼就跟ffmpeg 這樣的命令一毛錢關係都沒有了。我們是通過呼叫FFmpeg的框架的API進行處理的,各種東西就需要我們處理。

比如先註冊各種東西,檢測輸入檔案和輸出檔案,得出InputStream以及上下文context什麼的。

Context什麼的都是程式執行的時候才能決定的。比如AVFormatContext。

通過av_read_frame從AVFormatContext裡面讀取AVPacket(包),可以迴圈讀,如果返回-1,標示結束。

再判斷&packet.stream_index是音訊還是視訊,通過av_find_best_stream函式呼叫訪問AVFormatContext就能知道音訊和視訊流的標示是0還是1.

判斷搞定後,可以從AVFormatContext的streams陣列中獲取AVStream.

可以通過stream->avg_frame_rate.num/stream->avg_frame.den得到fps.幀率。

同時也可以通過avcodec_decode_video2函式的呼叫,引數是AVFormatContext和AVPacket 以及AVFrame得到一幀Frame。

那麼這個AVFrame的pts可以通過這個函式av_frame_get_best_effort_timestamp(frame)獲得。

//===========如果通過AVFliter濾鏡處理===============

上面得到AVFrame之後,如果之前我們已經初始化了AVFilterGraph,已經把AVFilterLink搞定,那麼就可以通過

av_buffsersrc_add_frame函式引數是AVFilterContext和AVFrame(我們讀到的frame),新增這個幀到濾鏡去,濾鏡自己處理了後。

通過av_buffersink_get_buffer_ref獲取濾鏡後的AVFilterBufferRef(這個結構體儲存了處理後的資料),結構和AVFrame差不多,可以copy過去。

一般AVFilterBufferRef通過函式sws_scale進行YUV的尺寸調整,否則在特殊情況下會導致視訊綠屏。

調整YUV 後,就可以寫入檔案什麼的,或者拿去播放了。

(貌似濾鏡通過後,pts會改變,需要調整,還沒具體測試,只是看到AVFilterBufferRef的結構這麼說)

//===============================================

如果我們得到AVFrame後不打算通過濾鏡,那麼就是把AVFrame的data儲存了,一般是YUV資料。

如上就是基本的簡單瞭解。需要注意的是time_base這個東西,AVCodectContext裡面的time_base和AVStream裡面的time_base是不一樣的。

其實每個結構體的time_base都不一樣,解碼和編碼不一樣。

關於音視訊同步問題,如果儲存YUV後,編碼成h264的時候就需要注意了,原視訊的幀率是多少。如果本來是30幀每秒,fps=30,你硬是設定

為num=1,den=25,結果就是視訊和音訊不同步,原因是視訊放得太慢了。還有一個就是如果本來是fps=19,你設定為25後,結果就是視訊也許

播放OK,但是會發現視訊最後幾幀不見了(也就是視訊變短了,其實是播放的速度太快,後面幾幀一閃而過)。

最後幾篇比較有用的文章:

MAC上搭建直播環境:nginx+rmtp環境,http://blog.csdn.net/yangxiao_xiang/article/details/51861688

推流,MAC上推攝像頭和桌面:http://blog.chinaunix.net/uid-11344913-id-4665455.html

AVFilter最有用的實戰:http://blog.csdn.net/encoder1234/article/details/53908931

相關推薦

FFMPEG總結自己

這篇文章是我自己看的,你未必能看懂,當做我自己的備份。 FFmpeg是複雜的開源系統,剛開始玩只知道用命令ffmpeg -i test.mp4 這樣的。其實普通使用者能有用這個命令ffmpeg和FFmpeg框架是有區別的。 其實ffmpeg這個命令是一個程式,程式碼是FF

資產專案總結含流程圖

今天對整個資產專案的流程進行總結: 資產專案流程圖: 專案模組解釋 一.專案管理模組 預算管理:對專案進行預算費用,進行預算時間,以及專案所屬分類的歸納。 專項管理:成立一個個專案組,提交的專案預算成立專項,實現一條龍查詢。並且在給專項撥款,以及專案的說明,和決

python庫os的總結保持更新...

os庫裡面提供了豐富的方法來處理檔案和目錄,自己在進行一些專案時經常用到,故記錄在下: 1. 返回當前的工作目錄     使用os.getcwd()函式,返回的是絕對路徑      2. 返回指定的資料夾包含的檔案或資料夾的名字的列表,這個列

鳥哥私房菜shell和shell指令碼總結自己

1、  cat 顯示內容,和echo寫入區別 2、  $0 為返回值 3、  &後臺執行命令,例子:程式名& 4、  echo 後邊什麼也不接當做回車使用 5、  bash是shell的一種。 6、  不打#!/bin/sh 將不能使用內建命令 7、  ec

FFmpeg總結十二ffmpeg與nginx實現直播多路流並發播放

xxx 開源 conf ref itl rect arc med rtm 圖:撒哈拉沙漠 下載 nginx 和 nginx-rtmp源碼: http://nginx.org/download/nginx-1.5.10.tar.gz https://github.com/a

salesforce零基礎學習七十二項目中的零碎知識點總結

gin 不同 grant dmi ima -m ron 角色 com 項目終於告一段落,雖然比較苦逼,不過也學到了好多知識,總結一下,以後當作參考。 一.visualforce標簽中使用html相關的屬性使用 曾經看文檔沒有看得仔細,導致開發的時候走了一些彎路。還好得到

c++的const總結2

通過 con 其他 綁定 strong col 指針和引用 兩個 tle c++的const小總結(1) http://www.cnblogs.com/MyNameIsPc/p/7091631.html 頂層const和底層cnost 先憑經驗區分一下兩者的區別?

EL表達式自己

日期 pattern mode lan dex 慎用 spring reac 一個 EL表達式 1、EL簡介 1)語法結構 ${expression} 2)[]與.運算符 EL 提供.和[]兩種運算符來存取數據。 當要存取的屬性名

Java學習總結十四——java反射機制,利用反射動態創建

Java反射 動態創建對象 一.Java反射機制1.什麽是反射:反射就是把Java類中的各種成份影射成一個個的Java對象。例:一個類有:成員變量,方法,構造方法等,包等等信息,利用反射技術可以對一個類進行剖析,把各個組成部分影射成一個個對象。2.Java反射常用類:(1)Class類—可獲取類和類的

UML實踐經典教程適合之前已經過大量資料作為總結復習

join wid custom 作用 延伸 mmu 系列 http oob UML全名為:Unified Modeling Language。是程序語言面向對象之後大家認可的一種設計“圖紙”,往往在之前的使用過程中大家都覺得沒什麽必要投入學習也能看懂。這就是這類圖的優勢。

談談你CountDownLatch的理解後悔,一必懂

CountDownLatch是java.util.concurrent包中一個工具類。它能夠使一個或者多個執行緒等待另外一些執行緒完成各自的工作之後,再繼續執行 使用CountDownLatch的一些情景: ①需要去解析一個Excel的資料,為了更快的解析,每個sheet都使用一個執行緒

談談你AtomicInteger的理解後悔,了必懂

AtomicInteger是一個提供原子操作的Integer類,通過執行緒安全的方式操作加減。十分適合高併發情況下的使用   對於全域性變數的數值型別操作 num++,若沒有加synchronized關鍵字則是執行緒不安全的,num++解析為num=num+1,明顯,這個操作不

GMT常用工具總結持續更新

引言 正文 minmax函式 快速獲取檔案中每一列資料的最小最大值 例子: gmt minmax AODT_1064.txt gmt: Warning: module minmax is deprecated; use gmtinfo. AODT_1064.txt: N

salesforce零基礎學習九十專案中的零碎知識點總結

本次的內容其實大部分人都遇到過,也知道解決方案。但是因為沒有牢記於心,導致問題再次出現還是花費了一點時間去排查了原因。在此記錄下來,好記性不如爛筆頭,爭取下次發現類似的現象可以直接就知道原因。廢話少說,進入正題。 我們在Goods__c表中有一個欄位型別為Picklist,欄位值有以下內容: 我們想要

python學習總結列表、元組、字典、集合、字符串

添加列 xtend 16px 指定 替換 需要 isa utf-8 head ---恢復內容開始--- 一、列表(list) 1.添加 append():追加,在列表末尾添加元素。 列表名.append(添加的元素) extend():擴展,在列表末尾添加元素。 列表名.e

性能測試總結 需求、設計

很快 頻繁 響應時間 定律 圖片 常用功能 inf com 其余 二、性能測試的需求 1.1 確定性能測試點 1)用戶常用功能 2)系統業務邏輯復雜、數據流轉頻繁的功能 3)與外部系統的接口處 2.2 確定性能指標 1.響應時間,2/5/8s 很快 還可以 很慢 ,

IDEA 2018.3技巧總結不斷完善

idea補丁破解 1)http://idea.lanyus.com/上可以找到最新的破解補丁,下載並放到軟體的bin目錄下  2)更改bin目錄下的兩個檔案:Idea.exe.vmoptions和Idea64.exe.vmoptions,在檔案末尾加上如:  -javaa

stm32串列埠通訊的一個總結從底層進行理解

從底層理解stm32USART串列埠通訊 以前學串列埠通訊踩過很多坑,過了一段時間又有些忘了,現在問了幾個很強很強的人差不多弄懂了,現在寫一寫總結,免得以後又忘了。 基本知識: 1、TDR和RDR都是USART_DR暫存器的緩衝區,指的是USART_DR的0到8位,TD

前端面試總結自己總結

1.給出一個數組如何去掉重複的項? var arr = [1,2,3,4,5,6,1,5,6]; function removeRepeat(arr) { var i,tempArr = []; for(i in arr){ //一種for迴圈寫法 if(tempA

各種集合如:Vector & ArrayList 等,總結區別

Vector & ArrayList 的主要區別  1) 同步性:Vector是執行緒安全的,也就是說是同步的 ,而ArrayList 是執行緒序不安全的,不是同步的 數2。   2)資料增長:當需要增長時,Vector預設增長為原來一倍 ,而ArrayList卻