1. 程式人生 > >使用raspberry pi直播來自攝像頭資料(一)

使用raspberry pi直播來自攝像頭資料(一)

要實現RTMP直播V4L2攝像頭資料,最簡單的方案就是使用FFMPEG,它已經實現了所有的功能,使用者只要使用一條命令就行了。但是對於有些嵌入式裝置,沒有足夠的硬體資源來執行FFMPEG,對於這種情況,只能是自己來實現所需的所有介面。

本文主要介紹在樹莓派上的使用,其他嵌入式裝置可以類推:

   1.在樹莓派linux系統,使用者通過v4l2採集攝像頭的資料。

   2.把採集到的攝像頭jpeg資料轉化成yuv格式。

   3.把yuv格式資料對進行x264編碼(x264只能對yuv格式資料壓縮)。

   4.使用RTMPdump庫通過RTMP協議將編碼好的H264資料推送到RTMP伺服器。

 5.

最後客戶端從RTMP伺服器中將資料拉下來,解碼,最後顯示出來,進而實現實時直播的目的

一:raspberry pi準備工作

【1】使用交叉編譯

   交叉編譯工具較快開發的速度。樹莓派中已經安裝了gcc工具鏈,可在樹莓派中直接編譯原始碼生成可執行檔案。於此同時,PC機上也可使用gcc工具鏈生成可執行程式碼,但是和樹莓派上的gcc工具不同,PC機上的gcc工具生成intel或amd晶片上可執行的程式碼,但樹莓派卻是arm系列的晶片,顯然存在不小的差異。那麼使用交叉工具鏈便可在PC機上開發樹莓派中可執行程式。

    雖然樹莓派的主頻可達700MHz遠高於一般的嵌入式系統,但相比於PC機其效能還是差些,使用交叉工具鏈可節約開發時間。在編譯連結同等規模的程式碼時,PC機所用的時間應少於樹莓派所用時間,通過交叉編譯的方法提高效率。

【2】搭建樹莓派交叉編譯環境

   1 . PC機環境 ubuntu 12.04 amd64

    請注意32位系統和64位系統存在差異,請注意博文中相關章節的描述。本文的程式在ubunut 12.04 amd64系統,ubuntu 12.04 i386系統中測試通過(硬碟安裝,虛擬機器環境)。

  2. 下載交叉編譯工具鏈

  下載gcc-linaro-arm-linux-gnueabihf-4.9-2014.07_linux.tar

  地址:http://pan.baidu.com/s/1cEqTBK

arm-linux-gnueabi-gcc和 arm-linux-gnueabihf-gcc類似,都可以用來編譯基於ARM平臺所有環節程式碼。

但兩個交叉編譯器也存在差別,分別適用於 armel 和 armhf 兩個不同的架構,armel 和 armhf 這兩種架構在對待浮點運算採取了不同的策略(有 fpu 的 arm 才能支援這兩種浮點運算策略)。

其實這兩個交叉編譯器只不過是 gcc 的選項 -mfloat-abi 的預設值不同。gcc 的選項 -mfloat-abi 有三種值 soft、softfp、hard(其中後兩者都要求 arm 裡有 fpu 浮點運算單元,soft與後兩者是相容的,但 softfp 和 hard 兩種模式互不相容):

soft: 不用fpu進行浮點計算,即使有fpu浮點運算單元也不用,而是使用軟體模式。

softfp:armel架構(對應的編譯器為 arm-linux-gnueabi-gcc )採用的預設值,用fpu計算,但是傳引數用普通暫存器傳,這樣中斷的時候,只需要儲存普通暫存器,中斷負荷小,但是引數需要轉換成浮點的再計算。

hard:armhf架構(對應的編譯器 arm-linux-gnueabihf-gcc )採用的預設值,用fpu計算,傳引數也用fpu中的浮點暫存器傳,省去了轉換,效能最好,但是中斷負荷高。

樹莓派預設採用arm-linux-gnueabihf-gcc

3. 加入環境環境變數

   在/.bashrc檔案中加入gcc交叉工具鏈目錄。

   sudo gedit ~/.bashrc

   在該檔案最後加入交叉工具鏈所在目錄。請注意~符號表示HOME路徑,.bashrc為隱藏檔案。

    【64位系統】

    exportPATH=$PATH: rpi/tools/ /gcc-linaro-arm-linux-gnueabihf-raspbian/bin

    請注意PATH代表環境變數,:冒號代表追加。

    儲存並退出檔案,接著執行以下指令以便立即更新當前控制檯所包含的環境變數。

    source .bashrc

4. 測試是否安裝成功

測試交叉工具鏈是否安裝成功,可在控制檯中輸入

    #arm-linux-gnueabihf-gcc -v

出錯: arm-linux-gnueabihf-gcc: error while loading shared libraries:libstdc++.so.6: cannot open shared object file: No such file or directory

 ubuntu解決方法 
sudo apt-get install lib32stdc++6 

sudo apt-get install lib32z1

再次# arm-linux-gnueabihf-gcc-v

   控制檯中輸出內容如下,此步驟可證明交叉工具鏈安裝完成且環境變數設定無誤。


【3】簡單的例子

    編寫一個測試檔案,在PC機上完成編譯然後通過Samba上傳到樹莓派中並執行。

    【測試程式碼】

    檔名為hello-world.c,該例子僅測試交叉編譯是否成功並簡單測試了浮點數功能。

	#include <stdio.h>  
 	int main(void)  
 	{  
 	    float pi = 3.14;      
 	    printf("Hello World\n");  
 	    printf("%.2f\n",2*pi);  
 	} 

【交叉編譯——簡單指令】

    cd進入hello-world.c所在目錄,輸入以下指令以生成可執行檔案。請注意該可執行檔案不能在PC機上執行。

    arm-linux-gnueabihf-gcc hello-world.c-o hello-world

    最終可在hello-world.c的同目錄中生成hello-world可執行檔案。

 【交叉編譯——makefile】

   當然也可在該目錄下建立makefile檔案,簡單的makefile檔案如下