在 Raspberry Pi 上使用 ffmpeg 将 H264 流传输到 Janus

在 Raspberry Pi 上使用 ffmpeg 将 H264 流传输到 Janus

我正在尝试使用 rtp 将 Raspberry Pi 摄像头源实时流式传输到在同一台 Raspberry Pi 上运行的 Janus 网关。到目前为止,Janus 和演示页面均正常运行,例如,流式传输页面将两个示例音频流式传输到另一台计算机上的浏览器。

我需要的是一个有效的 ffmpeg 单行程序,将 /dev/video0 上的摄像头作为输入,并将 rtp 流输出到 Janus,也许还带有相应的/opt/janus/etc/janus/janus.plugin.streaming.jcfg

到目前为止,我发现了一个使用 raspivid 插入 gstreamer 的有效单行程序,但是它严重滞后:

raspivid --verbose --nopreview -hf -vf --width 640 --height 480 --framerate 30 --bitrate 1000000 --profile baseline --timeout 0 -o - | gst-launch-1.0 -v fdsrc!h264parse!rtph264pay config-interval=1 pt=126!udpsink host=127.0.0.1 port=8004

我正在寻找与此类似的东西(显然在演示页面上无法工作/播放):

ffmpeg -f v4l2 -framerate 30 -video_size 640x480 -codec:v h264 -i /dev/video0 -codec:v libx264 -profile:v baseline -preset ultrafast -tune zerolatency -s 640x480 -b:v 1000k -f rtp rtp://localhost:8004

我的/opt/janus/etc/janus/janus.plugin.streaming.jcfg样子看起来像这样(尝试过带和不带注释掉单行):

h264-sample: {
    type = "rtp"
    id = 10
    description = "H.264 live stream"
    audio = false
    video = true
    videoport = 8004
    videopt = 96
    videortpmap = "H264/90000"
    #videofmtp = "profile-level-id=42e01f;packetization-mode=1"
    videofmtp = "packetization-mode=1"
}

任何帮助是极大的赞赏!

答案1

因此,经过大量研究和反复试验,我终于找到了使用 gstreamer 的解决方案。您可以使用类似这样的程序,它可以通过 Janus 完美播放,同时还能够调整分辨率、比特率和端口流的:

gst-launch-1.0 -v v4l2src device=/dev/video0 ! video/x-raw,width=1280,height=720,framerate=30/1 ! omxh264enc target-bitrate=1000000 control-rate=variable ! h264parse ! rtph264pay config-interval=1 pt=96 ! udpsink host=127.0.0.1 port=8004

嵌入当前时间和日期(在这种情况下格式为 14:55:03 01.08.2019)直接在流中,您可以使用:

gst-launch-1.0 -v v4l2src device=/dev/video0 ! video/x-raw,width=1280,height=720,framerate=30/1 ! clockoverlay time-format="%H:%M:%S %d.%m.%Y" outline-color=-16777216 color=-1 draw-shadow=false font-desc="myriad pro bold expanded 16" ! omxh264enc target-bitrate=1000000 control-rate=variable ! h264parse ! rtph264pay config-interval=1 pt=96 ! udpsink host=127.0.0.1 port=8004

为一个每晚直播(使用红外线 LED)我使用以下产品更亮但对比度更低(例如,它几乎是黑白的),因为你无论如何都看不到颜色。你也可以流式传输到同时在两个不同的端口

gst-launch-1.0 -v v4l2src extra-controls="c,brightness=65,saturation=-60" device=/dev/video0 ! video/x-raw,width=1280,height=720,framerate=30/1 ! clockoverlay time-format="%H:%M:%S %d.%m.%Y" outline-color=-16777216 color=-1 draw-shadow=false font-desc="myriad pro bold expanded 16" ! omxh264enc target-bitrate=3000000 control-rate=variable ! h264parse ! rtph264pay config-interval=1 pt=96 ! udpsink clients=127.0.0.1:8004,127.0.0.1:8040

使用 matroska 容器保存流(例如在运动检测/计时器之后)你可以使用这个:

gst-launch-1.0 -e udpsrc port=8040 ! application/x-rtp ! rtph264depay ! h264parse ! matroskamux ! filesink location=livecamera2.mp4

流式传输同一文件

gst-launch-1.0 -v filesrc location=livecamera2.mp4 ! matroskademux ! video/x-h264 ! rtph264pay config-interval=1 pt=96 ! udpsink host=127.0.0.1 port=8004

我希望这对某些人有帮助:)

答案2

我可以ffmpeg像这样用来传输我的网络摄像头视频。

$ ffmpeg \
    -f v4l2 -thread_queue_size 8192 -input_format yuyv422 \
    -video_size 1280x720 -framerate 10 -i /dev/video0 \
    -c:v h264_omx -profile:v baseline -b:v 1M -bf 0 \
    -flags:v +global_header -bsf:v "dump_extra=freq=keyframe" \
    -max_delay 0 -an -bufsize 1M -vsync 1 -g 10 \
    -f rtp rtp://127.0.0.1:8004/

不过,可能还有更多更好的 ffmpeg 选项设置。

相关内容