将处理后的视频从OpenCV传递到FFmpeg以进行HLS流(Raspberry PI)


嗨,我

有一个问题,我在树莓派上有openCV和ffmpeg,我正在尝试从树莓派流式传输实时视频。目前,我将openCV的输出保存为.avi文件,并且我有一个用于ffmpeg的命令 ffmpeg -i out.avi -hls_segment_filename '%03d.ts' stream.m3u8 此命令获取输出创建播放列表 (.m3u8) 和片段 (.ts)。

目前,我用C++编程了openCV(这不能改变),我有一个从中编程的可执行文件,我在Bash脚本中同时拥有可执行C++和上述ffmpeg。

#!/bin/bash
while true; do
./OpenCV
ffmpeg -i out.avi -hls_segment_filename '%03d.ts' stream.m3u8
done

这确实允许我流式传输处理过的 openCV 视频,我的问题是,由于 Bash 脚本处于 while 循环中,它会不断重置播放列表和 .ts 文件,所以我必须不断按客户端连接上的播放。

这周围有没有?

我尝试包含一个将增加每个循环的变量,但是如果我用它替换"%03d",则会出现错误。

如果您坚持使用程序(OpenCV)并在循环中ffmpeg,则可以使用start_number指定stream.m3u8的初始 hls 序列号。像这样:

... as before ...
ffmpeg -i out.avi -hls_segment_filename '%03d.ts' --start_number $I stream.m3u8

其中I是每次循环运行时必须递增的变量。但是这种方法非常脆弱,可能会导致不正确的流,因为它假设 ffmpeg 只会产生一个段,但实际上它可能会产生多个段。

更好的方法是并行运行OpenCVffmpeg,并使它们相互通信。这样,就无需写入临时文件out.avi并按顺序运行OpenCVffmpeg,并保持媒体序列同步。

我认为你可以像这样破解它。请注意,您可能需要更改OpenCV以便它不断写入out.avi并且一段时间后不会返回:

./OpenCV &
tail -n +0 -f out.avi  | ffmpeg -i pipe:0 -hls_segment_filename '%03d.ts' stream.m3u8

更好的方法是将程序更改为写入 stdout 或命名管道并像这样运行它:

./OpenCV | ffmpeg -i pipe:0 -hls_segment_filename '%03d.ts' stream.m3u8

相关内容

  • 没有找到相关文章

最新更新