說明
這次介紹一下基於上一篇文章“樹莓派編譯安裝 FFmpeg ”的應用,即 HLS 視頻流直播。原理是 FFmpeg 將 USB 攝像頭的原始視頻流壓縮為 H.264 視頻流,然后使用 FFmpeg 的 hls 切片工具將視頻流分為 n 個切片和 1 個 m3u8 文件,具體原理可以看這篇文章。
准備工作
樹莓派一個(1 至 3 代都可以)
USB攝像頭一個
已連接到網絡
步驟
將樹莓派接上 USB 攝像頭,lsusb 命令可以查看攝像頭型號等信息,同時 /dev 目錄下會多出來一個 video0 設備。在樹莓派中安裝 Web 服務器,考慮到樹莓派的性能,此次選用 nginx 。
sudo apt-get update
sudo apt-get install nginx
默認 nginx 的網站根目錄是在 /var/www/html ,為了方便,我們可以把根目錄改為 /var/www ,修改 /etc/nginx/sites-available 的 default 文件,將 root /var/www/html; 修改為 root /var/www; ,然后進入 /var/www 目錄,將 html 文件夾內的 index.nginx-debian.html 移到此目錄,然后重啟 nginx 服務。
cd /var/www;
sudo mv html/index.nginx-debian.html index.html
sudo rm -r html
sudo service nginx restart
HLS 不斷將視頻切片,循環寫入設定的 n 個文件,長時間的反復寫入可能會造成 SD 卡損壞,因此最好划分一個 16M 的內存空間用於存放切片文件。在 /var/www 目錄下創建 hls 文件夾,修改 /etc/fstab 文件,添加一項內容如下:
tmpfs /var/www/hls tmpfs defaults,size=16M 0 0
重啟樹莓派,輸入 df -h 命令后可以看到已經如下所示,說明掛載 tmpfs 到 /var/www/hls 成功。
tmpfs 16M 0 16M 0% /var/www/hls
在當前目錄即 /home/pi 創建 hls.sh 文件,寫入以下內容,其中 -r 10 代表幀率為 10 ,-s 640x480 代表分辨率,-b:v 300k 代表視頻碼率,c:v h264_omx 代表使用樹莓派的 omx 硬件編碼器,-segment_time 2 代表每個切片 2 秒,-segment_wrap 3 代表切片數量為 3 ,-segment_list_size 3 代表緩沖文件數量為 3 ,最后將切片的文件放到 /var/www/hls 目錄並生成 stream.m3u8 。
ffmpeg -f v4l2 -r 10 -s 640x480 -i /dev/video0 -b:v 300k -c:v h264_omx -an -f segment -segment_time 2 -segment_wrap 3 -segment_list_size 3 -segment_list "/var/www/hls/stream.m3u8" "/var/www/hls/stream%03d.ts"
執行 hls.sh
chmod +x hls.sh
./hls.sh
使用支持 html5 的瀏覽器就可以看到視頻流的內容,鏈接為:樹莓派IP/hls/stream.m3u8
總結
使用樹莓派的硬件編碼器的效果很明顯,基本不占用 CPU 的使用率。而此次使用的 HLS 是目前 html5 中能直接使用的直播視頻流協議,優點是穿透性好,有網絡的情況下都可以使用,而缺點很明顯,視頻的延時是很大的,按上文的設置也有至少 6s 的延時。期待更加好用的 WebRTC 協議能盡快普及。