2016-05-31 146 views
0

我嘗試通過RTP將H264傳輸到VLC,而不使用RTSP,即從IP攝像頭接收H.264數據流,並將其發送到另一臺主機上的VLC。 VLC打開URL「rtp:// @:12345」。 注意openRTSP使用H264VideoFileSink類做同樣的事情,但數據輸出到文件中,我替換的代碼部分:使用live555將H264傳輸到VLC

if (strcmp(subsession->mediumName(), "video") == 0) { 
    if (strcmp(subsession->codecName(), "H264") == 0) { 
     // For H.264 video stream, we use a special sink that adds 'start codes', 
     // and (at the start) the SPS and PPS NAL units: 
     //fileSink = H264VideoFileSink::createNew(*env, outFileName, 
      //   subsession->fmtp_spropparametersets(), 
      //   fileSinkBufferSize, oneFilePerFrame); 

     char const* outputAddressStr = "192.168.1.123"; // this could also be unicast 
     struct in_addr outputAddress; 
     outputAddress.s_addr = our_inet_addr(outputAddressStr); 

     const Port outputPort(12345); 
     unsigned char const outputTTL = 255; 

     Groupsock outputGroupsock(*env, outputAddress, outputPort, outputTTL); 
     rtpSink = H264VideoRTPSink::createNew(*env, &outputGroupsock, 96); 
    } 
… 

然後,

subsession->sink = rtpSink; 
    subsession->sink->startPlaying(*(subsession->readSource()), 
     subsessionAfterPlaying, 
     subsession); 

結果是openRTSP正在運行,但VLC收到沒有。我使用Wireshark來檢查,沒有數據包發送到目標IP和端口。

我也嘗試testMP3Streamer,用上面的單播地址替換多播地址。 VLC可以播放它。 有人能給我一些建議嗎?

回答

0

有severals錯誤在你的代碼,首先Groupsock範圍過於狹窄,未來需要一個H264成幀器養活H264VideoRTPSink,因爲你可以在H264VideoRTPSink.cpp看到:

Boolean H264VideoRTPSink::sourceIsCompatibleWithUs(MediaSource& source) { 
    // Our source must be an appropriate framer: 
    return source.isH264VideoStreamFramer(); 
} 

然後把所有一起會給這樣的東西:

char const* outputAddressStr = "192.168.1.123"; 
struct in_addr outputAddress; 
outputAddress.s_addr = our_inet_addr(outputAddressStr); 

const Port outputPort(12345); 
unsigned char const outputTTL = 255; 

Groupsock* outputGroupsock = new Groupsock(*env, outputAddress, outputPort, outputTTL); 
rtpSink = H264VideoRTPSink::createNew(*env, outputGroupsock, 96); 

subsession->addFilter(H264VideoStreamDiscreteFramer::createNew(*env, subsession->readSource()));    
+0

它的工作!VLC說:「SDP格式描述是需要接收RTP流。請注意,rtp:// URI不能與動態RTP有效載荷格式(96)一起使用。「這意味着VLC實際上接收到RTP數據包。謝謝。 – myggao

相關問題