HTML5 H264 видео иногда не отображается - PullRequest
0 голосов
/ 07 февраля 2020

Учитывая этот поток от камеры RTSP, которая производит поток H264:

Input #0, rtsp, from 'rtsp://admin:admin@192.168.0.15:554':
  Metadata:
    title           : LIVE555 Streaming Media v2017.10.28
    comment         : LIVE555 Streaming Media v2017.10.28
  Duration: N/A, start: 0.881956, bitrate: N/A
    Stream #0:0: Video: h264 (Main), yuv420p(progressive), 1600x900, 25 fps, 25 tbr, 90k tbn, 50 tbc

Я хочу запустить ffmpeg и направить его вывод в видеокомпонент HTML5 с MSE.

Все все в порядке, пока я запускаю эту команду ffmpeg (трубопровод удален!):

$ ffmpeg -i 'rtsp://admin:admin@192.168.0.15:554' -c:v copy -an -movflags frag_keyframe+empty_moov -f mp4

Однако в начале это занимает немного времени.

Я понял, что функция avformat_find_stream_info делает около 15-20 секунд задержки в моей системе. Здесь - это документы.

Теперь я также понял, что если я добавлю -probesize 32, avformat_find_stream_info вернется почти сразу, но это вызовет некоторые предупреждения:

$ ffmpeg -probesize 32 -i 'rtsp://admin:admin@192.168.0.15:554' -c:v copy -an -movflags frag_keyframe+empty_moov -f mp4

[rtsp @ 0x1b2b300] Stream #0: not enough frames to estimate rate; consider increasing probesize
[rtsp @ 0x1b2b300] decoding for stream 0 failed
Input #0, rtsp, from 'rtsp://admin:admin@192.168.0.15:554':
  Metadata:
    title           : LIVE555 Streaming Media v2017.10.28
    comment         : LIVE555 Streaming Media v2017.10.28
  Duration: N/A, start: 0.000000, bitrate: N/A
    Stream #0:0: Video: h264 (Main), yuv420p(progressive), 1600x900, 25 tbr, 90k tbn, 50 tbc

Если я выгружаю этот поток (в файл, test.mp4), все медиаплееры могут воспроизводить его отлично.

Однако, если я перенаправлю этот вывод в видео HTML5 с MSE, поток иногда отображается правильно иногда это просто не так. На консоли в браузере не выводятся предупреждения или сообщения об ошибках.

Из второго вывода видно, что fps отсутствует. Я попытался настроить его вручную, но безуспешно (казалось, я не мог изменить его вручную).

Как можно избежать avformat_find_stream_info и воспроизводить MSE HTML5, если я знаю все о заранее поток?

Обновление

В соответствии с комментариями и ответами @ szatmary у меня есть поиск парсера битового потока h264.

Это что я нашел. Я также сохранил файл mp4, который не воспроизводится HTML5 видео, но VL C делает, и я упал в этот анализатор.

Вот скриншот моего анализа: enter image description here

Некоторые факты здесь:

  • до тех пор, пока # 66 не появится type7 (SPS) единица в потоке.
  • 62 - это последний PPS перед прибытием первого SPS.
  • существует много PPS даже до 62.
  • поток битов заканчивается на # 103.
  • , играющих в VL C поток длится 20 секунд.

У меня есть несколько вещей, которые нужно очистить:

  1. единицы # 62 и # 66 sps / pps (или любые другие) удерживая метаданные только для следующих следующих кадров, или они могут даже ссылаться на предыдущие кадры?
  2. VL C воспроизводит 20 секунд, возможно ли, что он сканирует весь файл раньше, а затем воспроизводит кадры из № 1 на основе № 62 и № 66 информации? - если VL C получит файл в виде потока, в этом случае он может воспроизвести всего несколько секунд (# 66 - # 103).
  3. самое важное: что мне делать с парсером битового потока, чтобы HTML5 видео воспроизводило эти данные? Должен ли я бросить все юниты до # 62? Или до # 66?

Теперь я действительно потерялся в этой топи c. Я создал видео с помощью FFMPEG, но на этот раз я позволил ему завершить sh его функцию avformat_find_stream_info.

Сохранил видео теми же методами, что и ранее. VL C теперь воспроизводит 18 секунд (это нормально, у меня ограничение в 1000 кадров в команде ffmpeg).

Однако давайте теперь посмотрим информацию о битовом потоке:

enter image description here

Теперь PPS и SPS равны 130 и 133 соответственно. Это привело к потоку, который на 2 сек c короче, чем раньше. (Думаю)

Теперь я узнал, что в правильно проанализированном h264 до первого SPS (/ PPS) все еще может быть много блоков.

SO Я хотел бы уточнить мой вопрос выше: что мне делать с парсером битового потока, чтобы HTML5 воспроизводил видео эти данные?

Также парсер битового потока, который я нашел, не очень хорош, потому что он использует двоичную оболочку => она не может быть запущена исключительно на стороне клиента.

Я смотрю на mp4box сейчас.

1 Ответ

1 голос
/ 08 февраля 2020

Как можно избежать avformat_find_stream_info и воспроизводить HTML5 MSE, если я заранее знаю все о потоке?

Вы не знаете всего о потоке заранее. Вы не знаете ни разрешения, ни битрейта, ни уровня, ни профиля, ни флагов ограничений. Вы не знаете значений списков масштабирования, вы не знаете данных VUI, вы не знаете, используется ли CABA C.

Игроку нужны все эти вещи для воспроизведения видео, и они не знают, пока проигрыватель, или ffmpeg не увидит первые sps / pps в потоке. Ограничивая продолжительность анализа, вы говорите ffmpeg отказаться от его поиска, чтобы гарантировать, что он не создаст действительный поток. Иногда это может работать, иногда - нет, и это во многом зависит от того, с какого кадра в потоке rstp вы запускаете.

Возможным решением было бы добавить больше ключевых кадров к исходному видео, если это возможно. Это будет отправлять sps / pps чаще. Если вы не контролируете исходный поток, вы просто должны подождать, пока в потоке не появится sps / pps.

...