天天看點

Raspberry Pi 1Model B+ Streaming Troubleshoot

一、首次開機

使用裝置是6年前的Raspberry Pi 1b+,性能太差勁了。首先使用ubuntu挂載sd卡,

sudo mount -t drvfs G: sd/
cd sd/
           

當我們把樹莓派系統鏡像燒錄到SD卡之後,我們在windows看到的TF卡變成了空間很小的名為boot的盤,我們在此目錄下建立一個名為

wpa_supplicant.conf

空白檔案,并在其中加入以下配置:

country=GB
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
	ssid="WiFi名字,不删除引号,不能有中文"
	psk="WiFi密碼,不删除引号"
	priority=将我替換成數字,數字越大代表優先級越高
}
           

預設沒有ssh,開啟ssh,要在該分區建立一個空檔案ssh:

touch ssh
           

ssh連接配接位址使用主機名,不用每次查IP:

raspberrypi.local
pi,raspberry
           

使用bullseye的源:

deb http://mirrors.aliyun.com/raspbian/raspbian/ bullseye contrib firmware main non-free rpi
           

或者配置代理也可以,打開clash的Allow LAN選項,關閉防火牆,在rasp短的rasp-config中配置proxy。

ffmpeg

直接使用預編譯版本,不支援硬體編碼。編碼器選項使用:

-vcodec h264_v4l2m2m // 硬體編碼
-vcodec libx264  // 軟體編碼
           
ffmpeg  -f video4linux2 -video_size 640x480 -framerate 30 -thread_queue_size 1024 -s 640*480 -r 30 -i /dev/video0 -g 60 -b:v 2M -maxrate 2M -bufsize 2M -vcodec h264_v4l2m2m -pix_fmt yuv420p -f flv -flvflags no_duration_filesize "rtmp://live-push.bilivideo.com/live-bvc/?streamname=live_8684421_9312898&key=bdba22d8d07fb948160b3c8831d13a11&schedule=rtmp&pflag=9"
           

ultrafast設定,用于軟解:

ffmpeg -i /dev/video0 -tune zerolatency -vcodec libx264 -preset ultrafast -b:v 400k -s 640*480 -r 30 -f flv "rtmp://live-push.bilivideo.com/live-bvc/?streamname=live_8684421_9312898&key=bdba22d8d07fb948160b3c8831d13a11&schedule=rtmp&pflag=9"
           
ffmpeg -nostdin -threads auto -y -f v4l2 -thread_queue_size 4096 -fflags +genpts -flags +global_header -i /dev/video0 -vcodec h264_v4l2m2m -num_output_buffers 32 -num_capture_buffers 16 -an -s 640x480 -r 30 -sc_threshold 0 -pix_fmt yuv420p -b:v 2M -minrate 1M -maxrate 2M -bufsize 2M
           
從源碼編譯(使用h264_v4l2m2m):

不能用omx,omx在新版本中已經廢棄,源碼編譯參照[SOLVED] how to install 64 bit FFmpeg? - Raspberry Pi Forums:

ffmpeg -f video4linux2 -video_size 640x480 -framerate 24 -thread_queue_size 1024 -s 640*480 -r 24 -i /dev/video0 -g 48 -c:v h264_v4l2m2m -b:v 2M -maxrate 2M -bufsize 2M -c:a copy -f flv -flvflags no_duration_filesize ""
           
直播參數

bilibili支援最高碼率14000,支援1080P,16:9。

Raspberry Pi 1Model B+ Streaming Troubleshoot

輸出參數q,refers to the Constant Rate Factor (

crf

).

The range of the quantizer scale is 0-51: where 0 is lossless, 23 is default, and 51 is worst possible. A *lower* value is a higher quality and a subjectively sane range is 18-28. Consider 18 to be visually lossless or nearly so: it should look the same or nearly the same as the input but it isn’t technically lossless.

q=-0.0代表無損畫質。

Roundabout

h264_v4l2m2m雖然是硬體編碼器,但是該編碼器的輸出視訊不能直接在bilibili直播,是以目前隻能采取先寫入臨時檔案,再使用ffmpeg從臨時檔案讀取,推流到bilibili的辦法。

首先從usb攝像頭讀取視訊流并編碼,

capture.sh

如下:

#!/bin/bash

nohup ffmpeg -f video4linux2 -video_size 640x480 -framerate 20 -thread_queue_size 1024 -s 640*480 -r 20 -i /dev/video0 -g 40 -c:v h264_v4l2m2m -b:v 2M -maxrate 5M -bufsize 2M -f flv -flvflags no_duration_filesize tmp.flv
           

然後使用ffmpeg從本地臨時檔案推流,

push.sh

,push的時候,直播間的位址儲存至

live.txt

中,每次從檔案讀取:

#!/bin/bash

echo "$1"
nohup ffmpeg -re -i tmp.flv -vcodec copy -f flv "$1"
           

推流的速度比較快,能夠每秒推200FPS以上,編碼的速度根本趕不上,是以要使用

-re

選項,保持源視訊的速度,同時從攝像頭抓取視訊時把

tmp.flv

的幀率設定低一些,隻有20FPS。這樣推流就隻有20FPS,而抓取視訊一般可以達到24FPS,避免速度太快把檔案讀完後程序崩了。

啟動這背景兩個程序,

stream.sh

#!/bin/bash

rm -rf tmp.flv
rm -rf live.txt
echo "$1" >> live.txt
./capture.sh &
sleep 15
./push.sh "$1" &
           

推流使用

-vcodec copy

,不改變源檔案的編碼。

接着設定定時任務,

killboth.sh

用于殺死這兩個ffmpeg程序:

#!/bin/bash

NAME='ffmpeg'
echo $NAME
ID=$(ps -ef | grep "$NAME" | grep -v "$0" | grep -v "grep" | awk '{print $2}')
echo $ID
for id in $ID; do
    kill -9 $id
    echo "killed $id"
done
           

定時任務

checkalive.sh

,每次發現推流的程序崩了,就

killboth.sh

,然後執行

stream.sh

#!/bin/bash

ps -fe | grep 'ffmpeg -re' | grep -v grep
if [ $? -ne 0 ]; then
    echo "pushing process dead"
    ./killboth.sh
    ./stream.sh "$(cat live.txt)"
else
    echo "alive....."
fi
           

随後使用

crontab -e

,設定定時任務:

*/20 * * * * bash /home/pi/killboth.sh
*/1 * * * * bash /home/pi/checkalive.sh
           

每次崩了之後等定時任務拉起即可。

alive…"

fi

随後使用`crontab -e`,設定定時任務:

```bash
*/20 * * * * bash /home/pi/killboth.sh
*/1 * * * * bash /home/pi/checkalive.sh
           

每次崩了之後等定時任務拉起即可。

繼續閱讀