2013-12-11 3 views
1

Я построил версию Live555, которая использует FFMPEG для кодирования видео и передачи его по RTSP.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

В изображении с цветным железом размер кадра составляет 212000 байт.

В изображении радужного цвета размер кадра 322000 байт и больше максимального размера кадра 300000 и усечен, что приводит к тому, что вы видите в примере изображения.

Любая помощь будет высоко ценится

Благодаря

+0

Возможно, мне стоит упомянуть, что я протестировал часть кода FFPEG, записав пакеты в файл и воспроизведя его в VLC, он работает правильно. Live555, кажется, делает что-то смешное с потоком, прежде чем отправлять его поверх RTSP, я верю, что это потому, что он отбрасывает слишком много кадров. – 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