此篇尚在編輯中
這篇所牽涉的領域, 包含了樹莓派的系統設定, 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檔找不到而無法使用.
軟体編碼
軟体編碼的參數使用 -c:v h264
編碼因使用CPU, 所以CPU資源維持在 100%
編碼 1000個 frames, 大小為 161M, 畫質非常好, 如下
音訊
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