Я построил версию 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 и усечен, что приводит к тому, что вы видите в примере изображения.
Любая помощь будет высоко ценится
Благодаря
Возможно, мне стоит упомянуть, что я протестировал часть кода FFPEG, записав пакеты в файл и воспроизведя его в VLC, он работает правильно. Live555, кажется, делает что-то смешное с потоком, прежде чем отправлять его поверх RTSP, я верю, что это потому, что он отбрасывает слишком много кадров. – ALM865
AFAIK ffmpeg использует x264 для кодирования (при условии, что вы кодируете H.264). В этом случае вы можете настроить максимальный размер среза. – Ralf
Не похоже, что я могу установить максимальный размер среза в FFMPEG. Я вижу варианты для slice_count. Я дам вам повод и дам вам знать ... – ALM865