Raspberry FFMepg

      在〈Raspberry FFMepg〉中尚無留言

此篇尚在編輯中 

這篇所牽涉的領域, 包含了樹莓派的系統設定, webcam的擷取,  ffmpeg的編解碼, ubuntu的nginx 直播系統伺服器, Python的解析
這是一個龐大的專案, 還在編輯中, 目前也還不知要放在那個項目中, 請稍後.

歷程

因opencv的無解, 轉而發現ffmpeg的優良~~高興
1. 編碼成視訊時為何只能達成最多10fps?
ssd不夠快? cpu不夠快
2. 測試後, ram disk亦無法解決
3. 改成 1024*576解析, 儲存及網頁可以達順暢效果. 但畫面就是模糊
4. 實際測試 c922pro可以傳輸約30fps的畫面, 所以input 端沒問題
5. 思路~~編碼耗時過久–正解
6. 改用ffmpeg–初步得到正確答案, 後續待survey

1. c922pro 在1920*1080解析下, 可以輸出30fps
2. 樹莓派usb3.0 只能抓取約22fps–待測
3. Opencv的capture.write只能達到10fps為極限
4. ffmpeg硬体編碼預設的品質很差, 但改變bitrate為4000k後, 品質相當優, 且可達30fps, 只是webcam沒那麼高輸入, 所以約22fps即可
5. 如何使用socket傳送到server
6. 5不是問題, 因為要survey如何傳送到smtp
7. Opencv已知無法解決編碼fps過低問題, 所以一定要使用ffmpeg

提高硬体編碼品質

boxcolor=0x000000@0.5 : 0.5為透明度

ffmpeg -f v4l2 -video_size 1920x1080 -i /dev/video0 \
-vf drawtext='fontfile=fonts/FreeSerif.ttf:text=%{localtime}:x=5:y=20:fontcolor=white:fontsize=36:box=1:boxcolor=0x000000@0.5' \
-an -y \
-b:v 6000k \
-r 30 \
-c:v h264_omx \
-t 15 \
output.mp4

底下是推播到rtmp

input_format mjpeg是告知web cam的輸出格式, 以c922 pro而言, 有yuyv422 及 mjpeg.
yuyu422是靜態拍照用的. 若在ffmpeg不指定的話, 預設會採用yuyu422, 速度會非常的慢.

-c:v h264_omx採用硬体編碼, 然後輸出 flv格式.

受限於樹莓派USB的速度, 畫質開到最大 1920*1080時, 雖使用硬体編碼, 速度只能維持在 10 fps左右

ffmpeg -video_size 1920x1080 \
-input_format mjpeg \
-i /dev/video0 \
-vf drawtext='fontfile=fonts/FreeSerif.ttf: text=%{localtime} : x=5: y=20: fontcolor=white:fontsize=36: box=1: boxcolor=0x000000@0.5' \
-b:v 3000k -an \
-r 24 \
-c:a libfaac -ar 44100 -ab 48k \
-c:v h264_omx \
-f flv \
rtmp://ip/live/video8_1

早期的樹莓派, 若只是應用在一般的Office, 是非常強悍的. 但如果要播放影片,  就非常的吃力.

所以Pi4 加強效能, 變成四核心且提高運作頻率,  又在Soc裏加入了影像專用的硬体解編碼IC, 讓影片播放功能可以順暢.
FFMpeg是樹莓派硬体解編碼的套件. 使用此套件可以啟動硬体解編影訊音訊.

drawtext

iter01.com/406496.html

簡易測試

若FFMpeg有安裝成功, 可用如下指令測試

ffplay 影片.mp4 : 播放影片
ffplay /dev/video0 : 播放web cam

FFMpeg參數說明

查詢

ffmpeg -f v4l2 -list_formats all -i /dev/video0 :  web cam可用的解析度

輸入端之前

-s 1280×720解析度

ffmpeg -h : 說明
ffmpeg -hwaccels : 列出可用的硬体加速方法
-c:v 表示使用的視訊編碼器,即輸出視訊的編碼型別,h264_omx 是有硬體加成的 h264 編碼器
    c:v是簡寫,它還可以寫作 -codec:v or -vcodec. 若把h264_omx改為 copy 則保持原檔案的視訊編碼

開機後自動啟動ffmpeg

開機後, 若要自動啟動ffmpeg 推播, 可寫一script, 如car.sh. 然後於/etc/rc.local將此script寫入. 網路上都是這麼寫這麼說. 是沒錯, /etc/rc.local在 runlevel 3執行完畢後, 就會自動執行rc.local.

但在此時, 網路都還沒啟動, 所以執行ffmpeg推播會因沒網路而中斷, 根本無法啟動.

所以必需安排如下

1.  撰寫 car.sh 啟動ffmpeg

#!/bin/bash
while ! ping -q -c 1 -W 1 google.com>/dev/null
do
    sleep 1
done
nohup ffmpeg -video_size 1920x1080 -input_format mjpeg -i /dev/video0 -vf drawtext='fontfile=fonts/FreeSerif.ttf:text=%{localtime}:x=5:y=20:fontcolor=white:fontsize=36:box=1:boxcolor=0x000000@0.5' -b:v 3000k -an -r 24 -c:v h264_omx -f flv rtmp://ip/live/video8_1

請記得改car.sh權限

chmod 755 car.py

2. /etc/rc.local

/home/pi/car.sh &

解碥影片

ffmpeg -i xxx.mp4 -c:v h264_omx -crf 0 -vframes 1000 /dev/shm/output.mp4

硬体編碼

硬体編碼的參數使用 -c:v h264_omx
編碼時使用GPU, 所以CPU資源只在40%~80%之間

編碼 1000個 frames, 大小為 3.5M

不過此硬体編碼只能在Raspbian使用, 在ubuntu mate會有二個 .so檔找不到而無法使用.

gpu

gpu_performance

軟体編碼

軟体編碼的參數使用 -c:v h264
編碼因使用CPU, 所以CPU資源維持在 100%
編碼 1000個 frames, 大小為 161M, 畫質非常好, 如下

cpu

cpu_performance

音訊

videojs(html5)目前僅支援aac, 所以ffmpeg送給rtmp的音訊, 也必需為aac, ffmpeg送出aac的方式為

ffmpeg -i 來源 -c:a aac -ac 1 -strict -2 -b:a 128k -ar 44100 -f flv rtmp://ip

完整如下

ffmpeg -i 白蛇.緣起.White.Snake.2019.1080p.mkv -b:v 4000k -r 29 -c:v libx264 -c:a aac -ac 1 -strict -2 -b:a 64k -ar 44100 -f flv rtmp://mahaljsp.asuscomm.com/live/movie

編譯系統

Raspbian

編譯所需相關套件

sudo apt -y install autoconf automake build-essential cmake doxygen git graphviz imagemagick libasound2-dev libass-dev libavcodec-dev libavdevice-dev libavfilter-dev libavformat-dev libavutil-dev libfreetype6-dev libgmp-dev libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev libopus-dev librtmp-dev libsdl2-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-net-dev libsdl2-ttf-dev libsnappy-dev libsoxr-dev libssh-dev libssl-dev libtool libv4l-dev libva-dev libvdpau-dev libvo-amrwbenc-dev libvorbis-dev libwebp-dev libx264-dev libx265-dev libxcb-shape0-dev libxcb-shm0-dev libxcb-xfixes0-dev libxcb1-dev libxml2-dev lzma-dev meson nasm pkg-config python3-dev python3-pip texinfo wget yasm zlib1g-dev libdrm-dev

存放相關library目錄

mkdir ~/ffmpeg-libraries

編譯 Fraunhofer FDK AAC library

git clone --depth 1 https://github.com/mstorsjo/fdk-aac.git ~/ffmpeg-libraries/fdk-aac && cd ~/ffmpeg-libraries/fdk-aac && autoreconf -fiv && ./configure && make -j$(nproc) && sudo make install

編譯dav1d

git clone --depth 1 https://code.videolan.org/videolan/dav1d.git ~/ffmpeg-libraries/dav1d && mkdir ~/ffmpeg-libraries/dav1d/build && cd ~/ffmpeg-libraries/dav1d/build && meson .. && ninja && sudo ninja install

編譯kvazaar

git clone --depth 1 https://github.com/ultravideo/kvazaar.git ~/ffmpeg-libraries/kvazaar && cd ~/ffmpeg-libraries/kvazaar && ./autogen.sh && ./configure && make -j$(nproc) && sudo make install

編譯LibVPX

git clone --depth 1 https://chromium.googlesource.com/webm/libvpx ~/ffmpeg-libraries/libvpx && cd ~/ffmpeg-libraries/libvpx && ./configure --disable-examples --disable-tools --disable-unit_tests --disable-docs && make -j$(nproc) && sudo make install

編譯AOM

git clone --depth 1 https://aomedia.googlesource.com/aom ~/ffmpeg-libraries/aom && mkdir ~/ffmpeg-libraries/aom/aom_build && cd ~/ffmpeg-libraries/aom/aom_build && cmake -G "Unix Makefiles" AOM_SRC -DENABLE_NASM=on -DPYTHON_EXECUTABLE="$(which python3)" -DCMAKE_C_FLAGS="-mfpu=vfp -mfloat-abi=hard" .. && sed -i 's/ENABLE_NEON:BOOL=ON/ENABLE_NEON:BOOL=OFF/' CMakeCache.txt && make -j$(nproc) && sudo make install

zimg

git clone https://github.com/sekrit-twc/zimg.git ~/ffmpeg-libraries/zimg && cd ~/ffmpeg-libraries/zimg && sh autogen.sh && ./configure && make && sudo make install

更新連結

sudo ldconfig

編譯ffmpeg

git clone --depth 1 https://github.com/FFmpeg/FFmpeg.git ~/FFmpeg && cd ~/FFmpeg && ./configure --extra-cflags="-I/usr/local/include" --extra-ldflags="-L/usr/local/lib" --extra-libs="-lpthread -lm -latomic" --arch=armel --enable-gmp --enable-gpl --enable-libaom --enable-libass --enable-libdav1d --enable-libdrm --enable-libfdk-aac --enable-libfreetype --enable-libkvazaar --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopus --enable-librtmp --enable-libsnappy --enable-libsoxr --enable-libssh --enable-libvorbis --enable-libvpx --enable-libzimg --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-mmal --enable-nonfree --enable-omx --enable-omx-rpi --enable-version3 --target-os=linux --enable-pthreads --enable-openssl --enable-hardcoded-tables && make -j$(nproc) && sudo make install

todo

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *