2013-12-11 215 views
1

我已經構建了一個使用FFMPEG編碼視頻並通過RTSP流式傳輸的Live555版本。Live555 fMaxSize和FFMPEG

基本上它工作,但RTSP流非常緊張。

我看着它更進一步,事實證明,LIVE555的最大緩衝區大小(fMaxSize)是太小了,live555是被截斷的框架如下圖所示:

/* This should never happen, but check anyway.. */ 
if (newFrameSize > fMaxSize) { 
    fFrameSize = fMaxSize; 
    fNumTruncatedBytes = newFrameSize - fMaxSize; 
} else { 
    fFrameSize = newFrameSize; 
} 

現在,我有過幾乎沒怎麼控制來自FFMPEG的數據包很大,我可以將比特率設置得較低,但質量差,並且數據包仍然太大!

基本上FFMPEG決定每一幀是在這裏有多大:

int reti = avcodec_encode_video2(m_c, &pkt, m_frame, &got_packet); 

如果pkt.size> fMaxSize那麼幀將被截斷,並LIVE555將東西了流媒體視頻,這是做所有的時間。此外,FFMPEG有時會決定緩衝幀,因此數據包可能會超過一幀。

我可以嘗試,並告訴LIVE555到了它的緩衝區大小,但它完全忽略它:

OutPacketBuffer::maxSize = 100000; 

有其他人得到了一個解決方案,以正確的串編碼的視頻?我嘗試過把數據包打破並將它們傳遞給Live555,但是它不起作用,如果我發送更多的數據包,Live555會降低它的fMaxSize。

我的代碼是在這裏:

https://dl.dropboxusercontent.com/u/15883001/Code.zip

發生了什麼事到RTSP流的一些圖片是在這裏,你可以在更高的細節圖像LIVE555艱難地把發送的數據包,請參閱:

https://dl.dropboxusercontent.com/u/15883001/vlcsnap-2013-12-12-09h34m30s225.zip

在黑白圖像中,幀大小爲117000個字節,並且是小於最大幀大小300000

在Iron彩色圖像中,幀大小爲212000字節。

在彩虹色圖像中,幀大小爲322000字節,大於最大幀大小300000,並被截斷,導致您在示例圖像中看到的內容。

任何幫助,將不勝感激

感謝

+0

我可能應該提到我已經通過將數據包寫入文件並在VLC中播放來測試代碼的FFPEG部分,它似乎正常工作。在通過RTSP發送Live5之前,Live555似乎正在做一些有趣的事情,我相信這是因爲它會丟失太多幀。 – ALM865

+0

AFAIK ffmpeg使用x264進行編碼(假設您正在編碼H.264)。在這種情況下,您可以配置最大切片大小。 – Ralf

+0

似乎我不能在FFMPEG中設置最大切片大小。我可以看到slice_count的選項。我會給它一個去讓你知道... – ALM865

回答

1

你需要做數據的正確打包。 Live555已經擁有了一切。通過從文件中讀取數據,將數據包打包到rtp然後發送,看看它是如何工作的。這裏唯一的區別是你從編碼器而不是文件中取出。

+0

如何做到這一點的任何提示?目前我只是告訴FFMPEG對幀進行編碼(avcodec_encode_video2),如果它準備好了,它會回傳一個包。 – ALM865

+0

好吧,所以使用H264VideoStreamDiscreteFramer我的代碼通過增加OutputBufferSize工作,很好!但是我需要使用H264VideoStreamFramer,因爲它向程序所需的流添加了額外的數據,我嘗試讀取RTSP流。如何將我的數據包從avcodec_encode_video2轉換爲H264VideoStreamFramer可以使用的片段? – ALM865

+0

我知道這是一個有點偏離主題,但是這個SDP響應是否正確? https://dl.dropboxusercontent.com/u/15883001/packets.txt它與H264VideoStreamFramer創建的響應不同。 – ALM865