Как исправить ошибки ffmpeg?

Запускаю ffmpeg такой строкой:
ffmpeg -i http://входящий поток -c:v libx264 -deinterlace -timecode `date '+%H:%m:%S.00'` -s 500x300 -r 25 -force_key_frames "expr:gte(t,n_forced*2)" -vb 400k -profile:v high -preset:v slow -cpu-used -16 -subq 3 -qblur 1 -c:a libmp3lame  -b:a 22k -ac 2 -ar 22050 -f flv "rtmp://выход flashver=FMLE/3.0\20(compatible;\20FMSc/1.0) authmod=  live=1 playpath="

проблема том, когда входящий поток в HD качестве и для его загрузки требуется 8-11 Мб/с, ffmpeg выкидывает кучу ошибок и стрим тормозит и лагает, вот некоторые ошибки из консоли:
[h264 @ 0x35fa9e0] mmco: unref short failureime=00:00:20.63 bitrate= 392.3kbits/s speed=0.654x    65x
    Last message repeated 1 times
[h264 @ 0x35fa9e0] number of reference frames (0+5) exceeds max (4; probably corrupt input), discarding one
[mpegts @ 0x35f85a0] PES packet size mismatch10kB time=00:00:23.12 bitrate= 216.1kbits/s speed=0.565x
[mp2 @ 0x36b85c0] Header missing
Error while decoding stream #0:1: Invalid data found when processing input
[h264 @ 0x3636d20] reference picture missing during reorder
[h264 @ 0x3636d20] Missing reference picture, default is 66662
[h264 @ 0x37a7640] reference picture missing during reorder
[h264 @ 0x37a7640] Missing reference picture, default is 66663
[mpegts @ 0x35f85a0] PES packet size mismatch
[h264 @ 0x35fa9e0] Reference 2 >= 2
[h264 @ 0x35fa9e0] error while decoding MB 76 23, bytestream 40829
[h264 @ 0x37a7640] mmco: unref short failure
    Last message repeated 1 times
[h264 @ 0x37a7640] number of reference frames (0+5) exceeds max (4; probably corrupt input), discarding one
[h264 @ 0x3636d20] reference picture missing during reorder
[h264 @ 0x3636d20] Missing reference picture, default is 66712
[mp2 @ 0x36b85c0] Header missing0 size=     614kB time=00:00:23.40 bitrate= 214.9kbits/s speed=0.565x


Вот параметры входного потока:
Stream #0:0[0x65]: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p(tv, bt709, top first), 1920x1080 [SAR 1:1 DAR 16:9], 25 fps, 50 tbr, 90k tbn, 50 tbc
    Stream #0:1[0x66](rus): Audio: mp2 ([4][0][0][0] / 0x0004), 48000 Hz, stereo, s16p, 192 kb/s (clean effects)


При этом нагрузка на CPU 35-40%, то есть сервер не перегружен.
Сервер Ubuntu 14.04
Скорость интернета 70-80 Мб/с.
В чем проблема не пойму, если входящий поток не HD качества и для его загрузки требуется 3-5 Мб/с, то все нормально работает, ошибок нету, ничего не тормозит.
  • Вопрос задан
  • 7833 просмотра
Пригласить эксперта
Ответы на вопрос 1
@norman_edance
Ок. Вот что пока мне известно:

[h264 @ 0x7e4600] non-existing PPS 0 referenced
[h264 @ 0x7e4600] decode_slice_header error
[h264 @ 0x7e4600] no frame!


Это означает, что ffmpeg еще не видел ключевой кадр, который содержит информацию SPS и PPS. SPS и PPS имеют решающее значение для декодирования входящего кадра / среза. Ключевые кадры отправляются периодически (то есть каждые 5-10 секунд или более); так что если окажется, что вы присоединились к потоку до появления ключевого кадра; вы увидите это предупреждение для каждого кадра, пока не появится ключевой кадр.

Как только появится ключевой кадр, у ffmpeg будет достаточно информации для декодирования этого кадра (и любых последующих кадров до следующего ключевого кадра), и предупреждения исчезнут.

[h264 @ 0x14da960] reference picture missing during reorder
[h264 @ 0x14da960] Missing reference picture, default is 2147483647
[h264 @ 0x1595380] mmco: unref short failure
    Last message repeated 1 times
[h264 @ 0x1595380] number of reference frames (0+5) exceeds max (4; probably corrupt input), discarding one


Из описания похоже что, он ожидает "справочный" кадр, а потом их прилетает куча, когда уже опоздал, поэтому один кадр просто выбрасывает.

[mpegts @ 0x35f85a0] PES packet size mismatch

Переведенный комментарий из интернета:

Все вещатели, которых я знаю, устанавливают PES length до нуля для видеопотоков H264, потому что длина PES составляет 16-битное значение с максимальным 65535 байт (старый стандарт для видео MPEG2). Это слишком мало для большинства пакетов PES H264, поэтому его нужно установить на ноль (любая длина).

Почитать про PES здесь.

PES Длина пакета в Заголовке пакета PES (2 байта) Задает количество оставшихся байтов в пакете после этого поля. Может быть нулевым. Если длина пакета PES установлена ​​равной нулю, пакет PES может иметь любую длину. Значение нуля для длины пакета PES может использоваться только тогда, когда полезная нагрузка пакета PES является видеоэлементарным потоком.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы