2015-04-07 347 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