将经过处理的视频从 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_numberstream.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 而不会在一段时间后 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