【发布时间】:2020-02-07 18:15:25
【问题描述】:
鉴于这个来自 RTSP 摄像机的流,它产生 H264 流:
Input #0, rtsp, from 'rtsp://admin:admin@192.168.0.15:554':
Metadata:
title : LIVE555 Streaming Media v2017.10.28
comment : LIVE555 Streaming Media v2017.10.28
Duration: N/A, start: 0.881956, bitrate: N/A
Stream #0:0: Video: h264 (Main), yuv420p(progressive), 1600x900, 25 fps, 25 tbr, 90k tbn, 50 tbc
我想运行 ffmpeg 并将其输出通过 MSE 管道传输到 HTML5 视频组件。
只要我运行这个 ffmpeg 命令,一切都很好(管道被移除了!):
$ ffmpeg -i 'rtsp://admin:admin@192.168.0.15:554' -c:v copy -an -movflags frag_keyframe+empty_moov -f mp4
不过一开始需要一点时间。
我意识到avformat_find_stream_info 函数会在我的系统上造成大约 15-20 秒的延迟。 Here 是文档。
现在我也意识到,如果我添加-probesize 32,avformat_find_stream_info 几乎会立即返回,但会引起一些警告:
$ ffmpeg -probesize 32 -i 'rtsp://admin:admin@192.168.0.15:554' -c:v copy -an -movflags frag_keyframe+empty_moov -f mp4
[rtsp @ 0x1b2b300] Stream #0: not enough frames to estimate rate; consider increasing probesize
[rtsp @ 0x1b2b300] decoding for stream 0 failed
Input #0, rtsp, from 'rtsp://admin:admin@192.168.0.15:554':
Metadata:
title : LIVE555 Streaming Media v2017.10.28
comment : LIVE555 Streaming Media v2017.10.28
Duration: N/A, start: 0.000000, bitrate: N/A
Stream #0:0: Video: h264 (Main), yuv420p(progressive), 1600x900, 25 tbr, 90k tbn, 50 tbc
如果我将此流转储(到文件 test.mp4 中),所有媒体播放器都可以完美播放。
但是,如果我使用 MSE 将此输出通过管道传输到 HTML5 视频中,则流有时会正确显示,有时却不能正确显示。 浏览器的控制台上不会打印任何警告或错误消息。
从第二个输出我可以看到 fps 丢失。我尝试手动设置,但没有成功(似乎无法手动更改)。
如果我事先知道流的所有内容,如何避免使用 avformat_find_stream_info 并播放 HTML5 MSE?
更新
根据@szatmary 的 cmets 和答案,我已经搜索了一个 h264 比特流解析器。
This 是我找到的。我还保存了 HTML5 视频无法播放的 mp4 文件,但 VLC 可以播放,然后我进入了这个分析器。
这里有一些事实:
- 在 #66 之前,流中没有 type7 (SPS) 单元。
- 62 是第一个 SPS 到达之前的最后一个 PPS。
- 在 62 岁之前就有很多 PPS。
- 比特流在 #103 结束。
- 在 VLC 中播放流时长为 20 秒。
我有几件事要澄清:
- #62 和 #66 sps/pps 单元(或其他单元)只为接下来的帧保存元数据,或者它们甚至可以引用以前的帧?
VLC 播放 20 秒,是否可以先扫描整个文件,然后根据 #62 和 #66 信息播放 #1 的帧? - 如果 VLC 将文件作为流获取,在这种情况下它可能只播放几秒钟 (#66 - #103)。- 最重要的是:我应该如何使用比特流解析器来制作 HTML5 视频播放这些数据?
#62 之前的所有单位要我放弃吗?还是在 #66 之前?
现在我真的迷失在这个话题上了。我用 FFMPEG 创建了一个视频,但这次我让它完成了它的 avformat_find_stream_info 函数。
使用与以前相同的方法保存视频。 VLC 现在播放 18 秒(这没关系,我在 ffmpeg 命令中有 1000 帧限制)。
不过现在让我们看看比特流信息:
现在 PPS 和 SPS 分别为 130 和 133。这导致流比以前短 2 秒。 (我猜)
现在我了解到,在正确解析的 h264 中,在第一个 SPS(/PPS) 之前仍然可以有很多单元。
所以我会微调我上面的问题:我应该如何使用比特流解析器来制作 HTML5 视频来播放这些数据?
我发现的比特流解析器也不好,因为它使用二进制包装器 => 它不能纯粹在客户端运行。
我现在在看mp4box。
【问题讨论】:
标签: ffmpeg html5-video media-source