音視頻學習(八、瞭解FFmpeg)

昨天介紹了一下h264結構,介紹h264結構就是爲了這一次鋪墊的,我們源數據是YUV格式的,要想把YUV格式轉化成H264格式,就需要用到編碼技術,這個編碼技術的話,還是要說到FFmpeg,FFmpeg是業界公認的比較優秀的編解碼軟件,現在我也是需要這個軟件進行編解碼,所以有必要了解一波。

8.1 編譯安裝FFmpeg

FFmpeg是一套可以用來記錄、轉換數字音頻、視頻,並能將其轉化爲流的開源計算機程序。採用LGPL或GPL許可證。它提供了錄製、轉換以及流化音視頻的完整解決方案。它包含了非常先進的音頻/視頻編解碼庫libavcodec,爲了保證高可移植性和編解碼質量,libavcodec裏很多code都是從頭開發的。
FFmpeg在Linux平臺下開發,但它同樣也可以在其它操作系統環境中編譯運行,包括Windows、Mac OS X等。這個項目最早由Fabrice Bellard發起,2004年至2015年間由Michael Niedermayer主要負責維護。許多FFmpeg的開發人員都來自MPlayer項目,而且當前FFmpeg也是放在MPlayer項目組的服務器上。項目的名稱來自MPEG視頻編碼標準,前面的"FF"代表"Fast Forward"。《來自百度百科》

8.1.1 下載

總要抄一下介紹把,我感覺我寫的介紹比不上百度百科的,所以還要要抄抄,這樣多實際,先來一個FFmpeg官網,可以在這個官網下載,也可以通過官網瞭解一下其他信息,不過我現在喜歡在github下了,這是程序員的開源世界,所以在來一個github連接地址,可以在這裏下載,也可以直接git clone下,不過我下的有點慢,訪問國外的網站網速還是不行啊,還是乖乖的下一個壓縮包。

8.1.2 編譯

根據之前幾篇安裝redis,nginx應該對安裝比較熟了吧,不過這個ffmpeg不按套路出牌,ReadMe竟然沒看到安裝信息,找了很久,才發現在INSTALL.md這裏,看來以後還看記得看兩個文件一個是Readme,一個是INSTALL。

我把INSTALL的信息粘貼出來,這個寫的還是比較簡單的,不過我們之前也是3步,其實最麻煩的就是第一步配置,不過看着是不需要帶其他參數,暫時不帶,以後有問題再看看,反正源碼都在了不怕。
在這裏插入圖片描述
剛剛嘗試了一下./configure ,我是Debian系統,然後就報了一個錯:
nasm/yasm not found or too old. Use --disable-x86asm for a crippled build.
然後瀏覽了一下其他人的博客,找到了一篇介紹怎麼解決的,內容:
需要安裝yasm的彙編編譯器
sudo apt-get install yasm
分析:yasm是彙編編譯器,ffmpeg爲了提高效率使用了彙編指令,如MMX和SSE等。所以系統中未安裝yasm時,就會報上面錯誤。
如果不需要yasm也可以
./configure --disable-x86asm

原文鏈接:FFmpeg yasm/nasm not found or too old. Use --disable-yasm for a crippledbuild

果然安裝了之後,一馬平川,不過這個編譯,安裝時間有點久,可以等等。

make install之後,會把庫和頭文件拷貝到/usr/local/這個目錄,這個是configure默認的,在配置的時候其實我們可以自己配置的,只不過我比較偷懶就沒有配。

後面補加:
不知道是不是寫代碼的習慣,都不喜歡把前面的東西刪除掉,都是比較喜歡在後面添加,這次也不例外,前面的我就不修改了,記得看這個補加的。

其實上面的安裝步驟並沒有錯,問題是ffmpeg中自帶h264的解碼,但是沒有包含編碼,所以再執行後面的編碼demo程序一直沒找到h264編碼,這也是爲什麼我後來才補加的,就是因爲在測試demo程序的時候才發現有問題,所以我們需要額外添加x264支持h264的編碼。

安裝x264
可以到x264安裝路徑 下載x264的庫,然後解壓。
也可以通過git來安裝:git clone git://git.videolan.org/x264.git

安裝x264的操作我直接貼出來:

1. ./configure --enable-static --enable-share
2.make
3.sudo make install

比較簡單,直接按照命令執行即可。

重新編譯安裝ffmpeg
竟然需要重新打開libx264的功能,就需要重新編譯安裝ffmpeg,安裝步驟也直接貼出來

1. 配置ffmpeg時,加上x264,如:
./configure --enable-gpl --enable-libx264
2. make clean
3. make 
4. make install

這個重新裝的過程參考了這篇文章:ffmpeg推流時,可能出現錯誤:Unknown encoder ‘libx264’

8.1.3 測試

ffmpeg本來就是編解碼使用的,所以我們只要把一個視頻文件然後進行編解碼測試就可以了,

ffmpeg -i 720x480_25fps.mp4 -vcodec copy -acodec copy out.flv

測試的方式就是把MP4文件轉化成flv格式,然後在使用vlc播放器播放,可以播放就說明安裝成功了。

8.2 運行編碼demo

8.2.1 編譯demo

這個版本的demo好像移動了文件夾,在doc/examples中,還是老習慣,第一個看Readme,

這次的README沒有讓我失望,就是我需要的,裏面介紹了兩種方法,不過我選擇第二種,因爲我都是把源碼拖下來了,就不必在重新到其他目錄去了,所以只需要make examples就可以了。
在這裏插入圖片描述

8.2.2 運行demo

編譯完成後,很多可執行文件,現在比較關心編碼這一塊,所以列出編碼部分文件
在這裏插入圖片描述

之前就是在這裏運行demo的時候,發現不能h264編碼,所以看到這裏的如果沒有h264編碼的,需要回去看我補加的內容,這樣就支持h264編碼了。

運行的命令:

./encode_video 1.h264 libx264

因爲我們用的是libx264的庫,所以需要選擇libx264的編碼,下面就是demo執行成功進行編碼的打印。
在這裏插入圖片描述

我們打開編碼的文件1.h264
在這裏插入圖片描述
這個就是demo視頻錄製的h264格式的視頻,我也不知道爲什麼錄的是這麼多顏色,不過待會可以瀏覽一下代碼。

然後我們在用雷神的h264分析工具看一看:
在這裏插入圖片描述
毫無違和感,哈哈。

8.3 簡單分析代碼

這裏只是簡單分析一個encode_video.c的代碼,讓我們有一點初始編解碼的感覺,具體的源碼目前不分析,以後分不分析看情況,哈哈哈。源文件我就不復製出來了,這裏還是啓用寫重要函數的方式。

1avcodec_find_encoder_by_name(codec_name)    `//通過我們輸入的名字尋找編碼器,這裏傳參的是libx264
2avcodec_alloc_context3(codec);      //就相當於編碼器的一個全局的控制塊,後面就是堆編碼控制塊進行初始化
3av_packet_alloc();               //申請一個packet,在編碼完成之後接收數據使用
4avcodec_open2(c, codec, NULL);   //context全局控制塊已經準備好了,然後進行打開編碼器的操作
5av_frame_alloc();               //申請一幀的空間,這個就是我們準備的一幀數據,丟給編碼器編碼使用
6av_frame_get_buffer(frame, 0);        //爲上面申請的幀frame申請內存空間
7av_frame_make_writable(frame);                //抱枕frame的數據是可寫的
8//demo程序使用的是手動填充YUV數據,強,下一節我介紹的是通過讀取文件的方式
9avcodec_send_frame(enc_ctx, frame); 
//把原始數據發送給編碼器,進行編碼,然後下面在接收通過編碼器編完碼之後的數據,
//不過現在這個接口可能要廢棄了,不過使用到還可以使用,新接口用這種了avcodec_encode_video2
10avcodec_receive_packet(enc_ctx, pkt);         //接收編碼器回來的數據
11fwrite(pkt->data, 1, pkt->size, outfile);	//把接收到的數據寫入到文件中
12av_packet_unref(pkt);						//清楚的包
13avcodec_free_context(&c);					//釋放context
14av_frame_free(&frame);						//釋放幀緩衝
15av_packet_free(&pkt);						//釋放packet

差不多就這麼多步驟,解碼的話,我這裏就不寫了,因爲看着也差不多其實,大家有空去看看。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章