我已經構建了一個使用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,並被截斷,導致您在示例圖像中看到的內容。
任何幫助,將不勝感激
感謝
我可能應該提到我已經通過將數據包寫入文件並在VLC中播放來測試代碼的FFPEG部分,它似乎正常工作。在通過RTSP發送Live5之前,Live555似乎正在做一些有趣的事情,我相信這是因爲它會丟失太多幀。 – ALM865
AFAIK ffmpeg使用x264進行編碼(假設您正在編碼H.264)。在這種情況下,您可以配置最大切片大小。 – Ralf
似乎我不能在FFMPEG中設置最大切片大小。我可以看到slice_count的選項。我會給它一個去讓你知道... – ALM865