)
我经过了漫长的奋斗才熟悉了 FFMPEG 这个神奇的东西。我应付了好几件事,认识到我永远也学不会掌握它的 1%,但到目前为止我需要的一切都“非常有效”……
...除了一件事:
RTSP 流传输正常,但我无法
-f tee
可以同时将分段文件流式传输和写入磁盘。无论哪种方式都可以,使用 -f tee 会导致整个过程失败,我找不到错误消息的解决方案...
我让 ffmpeg 将其流发送到“rtsp-simple-server”,到目前为止我认为这是一个很好的解决方案。同时我希望写入磁盘。命令行:
ffmpeg -threads 3 -fflags +igndts -vsync 1 -stats -re -f v4l2 -input_format h264 -video_size 1286x972 -fflags +genpts -i /dev/video0 -avoid_negative_ts make_zero -c:v h264_omx -copytb 1 -b:v 500K -maxrate 500K -bufsize 500K -map 0:v -f tee "[f=segment:segment_time=60:segment_format=mp4]capture-%03d.mp4|[f=rtsp]rtsp://localhost:$RTSP_PORT/$RTSP_PATH"
```
$RTSP_PORT=8554, $RTSP_PATH=cam. I expected a regular stream and some files in the current directory, but all I got was:
```
Input #0, video4linux2,v4l2, from '/dev/video0':
Duration: N/A, start: 10461.790201, bitrate: N/A
Stream #0:0: Video: h264 (High), yuv420p(progressive), 1286x972, 30 fps, 30 tbr, 1000k tbn, 2000k tbc
Stream mapping:
Stream #0:0 -> #0:0 (h264 (native) -> h264 (h264_omx))
Press [q] to stop, [?] for help
[h264_omx @ 0x5dbab0] Using OMX.broadcom.video_encode
[segment @ 0x6313b0] Opening 'capture-000.mp4' for writing
2023/01/13 00:43:17 INF [RTSP] [conn [::1]:41996] opened
2023/01/13 00:43:17 INF [RTSP] [session 8091f947] created by [::1]:41996
2023/01/13 00:43:17 INF [RTSP] [session 8091f947] is publishing to path 'cam', with UDP, 1 track (H264)
Output #0, tee, to '[f=segment:segment_time=60:segment_format=mp4]capture-%03d.mp4|[f=rtsp]rtsp://localhost:8554/cam':
Metadata:
encoder : Lavf58.20.100
Stream #0:0: Video: h264 (h264_omx), yuv420p, 1286x972, q=2-31, 500 kb/s, 30 fps, 30 tbn, 30 tbc
Metadata:
encoder : Lavc58.35.100 h264_omx
[tee @ 0x5da9b0] Non-monotonous DTS in output stream 0:0; previous: 0, current: 0; changing to 1. This may result in incorrect timestamps in the output file.
如您所见,我在 Pi4 上使用带有 h264_omx 编码器的 raspbian 安装。我很确定这个编码器有问题,但出于某种原因,我无法找出问题所在,因为我甚至找不到有关它的文档。
问题在于常规编码器无法保持性能,因为 _omx 使用 Raspi 的小型图形小工具而其他编码器没有:CPU 无法跟上我所看到的编码和文件大小。
所以我的问题是:有没有办法在 a) 流式传输和 b) 将分段文件写入磁盘时保留 h264_omx 编码器?我可以看到它是时间戳上的一些东西,但我遇到的所有标志都没有效果 :-(
请帮助我的小 ARM 玩具实现它的使命并结束我的痛苦:-)
答案1
同时,我发现 h264_omx 无法使用“tee”方法同时进行流式传输并将流保存到磁盘。
我没有重新编码由相机提供的 h.264 流来更改比特率,而是通过 v4l2 控件设置相机来执行此操作。ffmpeg 内部的传输现在基本上是 c:v 复制,这可将负载降至最低。
因此:检查比特率限制,检查配置文件,处理其余部分,负载保持安全......
不过:遗憾的是,由于 raspi 被广泛用于相机和流媒体应用,h264_omx 并没有受到足够的重视 :-(