将经过处理的视频从 OpenCV 传递到 FFmpeg 以进行 HLS 流式传输 (Raspberry PI)
Passing processed Video from OpenCV to FFmpeg for HLS streaming (Raspberry PI)
嗨,我有一个问题,我在 Raspberry Pi 上有 openCV 和 ffmpeg,我正在尝试从 raspberry pi 流式传输实时视频。目前我将 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 只会产生一个片段,但实际上它可能会产生多个片段。
更好的方法是 运行 OpenCV
和 ffmpeg
并行,让它们相互对话。通过这样做,将不需要按顺序写入临时文件 out.avi
和 运行 OpenCV
和 ffmpeg
并保持媒体序列同步。
我认为你可以像这样破解它。请注意,您可能需要更改 OpenCV
以便它不断写入 out.avi
而不会在一段时间后 return 写入:
./OpenCV &
tail -n +0 -f out.avi | ffmpeg -i pipe:0 -hls_segment_filename '%03d.ts' stream.m3u8
更好的方法是将程序更改为写入标准输出或命名管道,运行 就像这样:
./OpenCV | ffmpeg -i pipe:0 -hls_segment_filename '%03d.ts' stream.m3u8
嗨,我有一个问题,我在 Raspberry Pi 上有 openCV 和 ffmpeg,我正在尝试从 raspberry pi 流式传输实时视频。目前我将 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 只会产生一个片段,但实际上它可能会产生多个片段。
更好的方法是 运行 OpenCV
和 ffmpeg
并行,让它们相互对话。通过这样做,将不需要按顺序写入临时文件 out.avi
和 运行 OpenCV
和 ffmpeg
并保持媒体序列同步。
我认为你可以像这样破解它。请注意,您可能需要更改 OpenCV
以便它不断写入 out.avi
而不会在一段时间后 return 写入:
./OpenCV &
tail -n +0 -f out.avi | ffmpeg -i pipe:0 -hls_segment_filename '%03d.ts' stream.m3u8
更好的方法是将程序更改为写入标准输出或命名管道,运行 就像这样:
./OpenCV | ffmpeg -i pipe:0 -hls_segment_filename '%03d.ts' stream.m3u8