我正在使用 ffmpeg 处理来自远程摄像机的传入 MPEGTS 流,并使用我的应用程序将其传送给多个客户端。
从技术上讲,我正在使用 ffmpeg 将传入流转换为 MJPEG 输出,并将数据块(来自 ffmpeg 进程 stdout)传输到客户端 http 响应上的可写流。
但是,我面临一个问题——并非所有数据块都代表完整的“整个”帧。因此,在浏览器中连续显示它们会导致视频随机闪烁,并出现半完整帧。我知道这一点,因为当打印每个块长度时,结果大多数时候会得到一个大值 (X),但有时我会得到 2 个连续的块,长度为 (2/5X),然后是 (3/5X)。
所以问题- 有没有办法强制 ffmpeg 进程仅输出整个帧?如果没有,有没有办法让我“手动”检查每个数据块并查找标头/元数据/标志来指示帧开始/结束?
我用于输出 MJPEG 的 ffmpeg 命令是:
ffmpeg -i - -c:v mjpeg -f mjpeg -
解释:
“-i-”:(输入)是进程的标准输入(而不是静态文件)
“-c:v mjpeg” :使用 mjpeg 编解码器
“-f mjpeg” :输出将采用 mjpeg 格式
“-” :未指定输出(文件或 URL) - 将是流程标准输出