2015-04-07 291 views
1

我需要与期望来自相机的MPEG-4 RTP流(实际上来自多个不同相机的多个流)的硬件接口。我们想要做的就是从一组小的.mp4文件中提供视频,无休止地循环播放。循环播放MP4视频

我想要现在的问题是使用l​​ibVLC在服务器模式,用“--loop”的说法。代码如下:

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 - 不,我不想抢劫博物馆。这是模拟器。

回答

1

cvlc(CLI VLC)中运行相当于您的代码的结果为“死输入”,可能是由于不连续(说没有更多的ES可以播放...)。

有一种方法可以使用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

*应使用自动化机器人垃圾桶进行博物馆盗窃。

+0

在这种情况下,真正的客户端(从我们的角度来看)挂在以太网链路上的黑盒子。这意味着我们必须准确地*给他们*他们的期望,他们的协议并没有提到RTSP(只是RTP和MP4)。所以我不确定是否涉及RTSP和/或SDP。该议定书文件很难提及ICMP和ARP,所以你会认为如果涉及RTSP或SDP,他们会这么说。但也许RTP意味着其中的一个或两个,这只是我的无知而已?我会试试看看会发生什么。 –

+0

我只是想象它是一个连续的RTP/MP4流(广播到一个多播地址),客户端可以跳入和跳出。 –

+0

我以为你使用的是SDP,因为你的示例命令说'sdp = rtsp:// localhost:8080/test.sdp'。如果没有会话描述协议,它可能不知道如何播放流,因为FFmpeg使用动态负载类型ID(96),因此需要将其映射到SDP中的实际流类型。你到目前为止如何测试它? – aergistal