我需要与一台预期来自摄像机的MPEG-4 RTP流的硬件接口(实际上是来自多个不同摄像机的多个流)。我们要做的是从一组小的.mp4文件提供该视频,无休止地循环。 1
我现在正在尝试的是在服务器模式下使用libVLC,使用" - 循环"论点。此代码如下所示:
libvlc_vlm_add_broadcast(vlc, "test", ("file:///" + video).c_str(),
"#rtp{dst=localhost,port=1234,sdp=rtsp://localhost:8080/test.sdp}",
1, broadcast_options, true, true);
const auto play_result = libvlc_vlm_play_media(vlc, "test");
这似乎在我的桌面上工作,有一个问题:我也必须把玩家放在循环上。如果我只是要求播放器播放一次流,它会在达到服务器文件末尾时停止。
有没有办法让它像一个连续的(永无止境的)流一样看待客户端? VLC不是必需的,但是RTP MP4流是。
1 - 不,我不想抢劫博物馆。这是一个模拟器。
答案 0 :(得分:1)
在cvlc
(CLI VLC)中运行相当于您的代码会导致"死输入",可能是由于不连续(说没有ES可以播放......)。 / p>
有一种方法可以使用FFmpeg
来完成,但它并不是非常简单。如果有更简单的方式我也想知道。
1。创建要播放的文件的播放列表(例如playlist.txt
)。没有播放列表循环选项,因此您需要根据需要多次重复播放列表中的文件。使用格式:
file '/path/to/file/1.mp4'
file '/path/to/file/2.mp4'
file '/path/to/file/3.mp4'
[... repeat ...]
file '/path/to/file/1.mp4'
file '/path/to/file/2.mp4'
file '/path/to/file/3.mp4'
从这里开始,您将使用concat demuxer创建无缝流。您有两种选择:
2-A。使用RTP并手动提供SDP文件。每个端口只能使用一个流,因此如果需要音频,则需要将其映射到第二个输出。
ffmpeg -re -f concat -i playlist.txt -an -vcodec mpeg4 -f rtp rtp://127.0.0.1:1234
SDP显示在控制台输出中:
v=0
o=- 0 0 IN IP4 127.0.0.1
s=No Name
c=IN IP4 127.0.0.1
t=0 0
a=tool:libavformat 56.26.101
m=video 1234 RTP/AVP 96
b=AS:200
a=rtpmap:96 MP4V-ES/90000
a=fmtp:96 profile-level-id=1
2-B。使用RTSP将流发送到支持它的服务器(文档指定Darwin Streaming Server和Mischa Spiegelmock的RTSP服务器)。您需要在执行以下操作之前安装和配置服务器:
ffmpeg -re -f concat -i playlist.txt -an -vcodec mpeg4 -f rtsp rtsp://server:port/stream_name.sdp
然后在客户端上使用rtsp://server/stream_name.sdp
。
*应使用自动化机器人垃圾桶进行博物馆盗窃。