天天看點

發燒友實測!用飛淩OKA40i-C開發闆玩轉FFmpeg

本篇試用報告由發燒友 zealsoft提供,感謝 zealsoft的支援。飛淩嵌入式會在電子發燒友和電路城論壇持續開展開發闆有獎試用活動,更有京東E卡等着你!歡迎大家的持續關注。

1. FFmpeg的安裝

FFmpeg是用來記錄、轉換數字音頻、視訊的開源軟體,它支援檔案和網絡流操作。它支援以函數庫的方式使用,是以有很多軟體都依賴它,比如VLC、暴風影音、騰訊會議等。它的指令行程式也非常強大,各種指令行選項學起來雖然困難,但是幾乎能夠滿足日常對音視訊的各種處理需求。今天我們就通過飛淩嵌入式OKA40i-C開發闆來介紹它的指令行工作方式。

FFmpeg提供了全部源代碼,是以在網上可以找到很多教程是關于交叉編譯ARM版本的。我們測試的版本使用的是FFmpeg-release-armel-static.tar.xz。解壓縮以後拷貝到飛淩嵌入式OKA40i-C開發闆上并設定好權限就可以使用了。

2. USB攝像頭測試

OKA40i-C開發闆接口豐富,它支援USB攝像頭、CMOS-OV5640攝像頭、模拟攝像頭。把USB攝像頭插入開發闆,然後使用

v4l2-ctl --list-devices

可以看到/dev/video0就是我們的USB攝像頭,如下圖。

發燒友實測!用飛淩OKA40i-C開發闆玩轉FFmpeg

使用下面的指令可以看到該攝像頭的全部參數:

v4l2-ctl -d /dev/video0 --all

Driver Info (not using libv4l2):

Driver name : uvcvideo

Card type : USB2.0 PC CAMERA

Bus info : usb-sunxi-ehci-1

Driver version : 3.10.65

Capabilities : 0x04000001

Video Capture

Streaming

Video input : 0 (Camera 1: ok)

Format Video Capture:

Width/Height : 640/480

Pixel Format : 'YUYV'

Field : None

Bytes per Line : 1280

Size Image : 614400

Colorspace : Default

Transfer Function : Default

YCbCr Encoding : Default

Quantization : Default

Crop Capability Video Capture:

Bounds : Left 0, Top 0, Width 640, Height 480

Default : Left 0, Top 0, Width 640, Height 480

Pixel Aspect: 1/1

Streaming Parameters VideoCapture:

Capabilities : timeperframe

Frames per second: 30.000 (30/1)

Read buffers : 0

brightness (int) : min=0 max=255 step=1 default=128value=128

contrast (int) : min=0 max=255 step=1 default=135value=135

saturation (int) : min=0 max=255 step=1 default=75 value=75

hue (int) : min=-127 max=127 step=1 default=0 value=0

gamma (int) : min=1 max=8 step=1 default=4 value=4

power_line_frequency (menu) : min=0 max=2 default=1 value=1

sharpness (int) : min=0 max=15 step=1 default=5 value=5

backlight_compensation (int) : min=1 max=5 step=1 default=1 value=1

我們使用了兩種型号的USB攝像頭,按照手冊說明使用内置的uvccamera程式進行測試,不過都沒有成功,得到的錯誤資訊如下圖所示。

發燒友實測!用飛淩OKA40i-C開發闆玩轉FFmpeg
發燒友實測!用飛淩OKA40i-C開發闆玩轉FFmpeg

我們使用FFmpeg可以抓取視訊,指令行如下:

ffmpeg -f video4linux2 -s 640x480 -pix_fmt yuyv422 -i /dev/video0 out.yuv

使用Windows版本的ffplay可以正常播放抓取的視訊,指令行如下:

ffplay -s 640x480 -pix_fmt yuyv422 out.yuv

上面儲存的是YUV格式的原始視訊,如果要儲存壓縮視訊,可以用下面的指令行:

ffmpeg -y -t 15 -r 25 -f video4linux2 -i /dev/video0 out3.mp4-timestamps bs

其中的-r 25表示每秒采樣25幀,這個參數必須有,否則FFmpeg可能會不斷地采集并壓縮同一視訊幀。-r參數超過30沒有什麼意義,因為USB攝像頭的最大能力就是30fps。

飛淩嵌入式OKA40i-C開發闆可以對于1080P的視訊壓縮達到45fps,是以對USB攝像頭的視訊壓縮應該沒有什麼壓力。

3. FFmpeg性能測試

FFmpeg有個benchmark參數可以友善進行性能測試。我們對A40i開發闆自帶的一個MP4視訊就行解碼測試,指令行如下:

ffmpeg-benchmark -i translate.mp4 -f null –

得到的測試資料如下:

video:148kB

audio:3428kB subtitle:0kB other streams:0kB globalheaders:0kB muxing

overhead:unknown

bench:utime=2.820s stime=0.110s rtime=0.956s

bench:maxrss=14208kB

由于我手上暫時沒有其他的開發闆可以對比,于是就通過我用了5年的i7-6500筆記本測試了一下,測試結果如下:

video:241kB

audio:3428kB subtitle:0kB other streams:0kB globalheaders:0kB muxing

overhead:unknown

bench:utime=0.391s stime=0.000s rtime=0.228s

bench:maxrss=20316kB

4. FFmpeg産生實時視訊流

FFmpeg可以支援實時視訊流的發送和接收,進而可以把OKA40i-C開發闆上的視訊實時發送到PC上,由PC上的軟體實時接收并顯示。我們可以使用下面的指令将OKA40i-C開發闆上的一個MP4轉換為RTP碼流發送的PC上:

ffmpeg -re -i test.mp4 -an -c copy -f rtp rtp://192.168.0.105:1234

使用Wireshark可以看到在PC機的1234端口收到大量來自OKA40i-C開發闆的H.264視訊流。

發燒友實測!用飛淩OKA40i-C開發闆玩轉FFmpeg

如果想在PC上顯示視訊流,需要建立一個SDP檔案,它描述視訊流中的端口和編碼資訊。

SDP是來自SIP标準中定義,目前VLC、Apple QuickTime和ffplay等很多軟體都可以打開SDP檔案,并按照SDP中的描述顯示視訊流。SDP檔案并不需要手工編寫,在ffmpeg運作時它會顯示指令行所對應的SDP定義,如下圖所示。

發燒友實測!用飛淩OKA40i-C開發闆玩轉FFmpeg

也可以用重定向将輸出寫入一個SDP檔案,如:

ffmpeg -re -i test.mp4 -an -c copy -f rtp rtp://192.168.0.105:1234 > rtp.sdp

下面就是使用VLC顯示的接收到的視訊流。

發燒友實測!用飛淩OKA40i-C開發闆玩轉FFmpeg

5. FFmpeg轉發USB攝像頭的視訊流

前面示範了将MP4檔案轉換為視訊流,我們也可以将USB攝像頭采集的内容實時轉發到PC上,使用下面的指令行即可。

ffmpeg -y -t 15 -r 25 -f video4linux2 -i /dev/video0 -f rtp

rtp://192.168.0.105:1234 > usb.sdp

再使用下面的指令行就可以看到實時抓取的USB攝像頭的視訊流了:

ffplay -protocol_whitelist "file,udp,rtp" -i usb.sdp