Учитывая этот поток от камеры 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 делает, и я упал в этот анализатор.
Вот скриншот моего анализа:
Некоторые факты здесь:
- до тех пор, пока # 66 не появится type7 (SPS) единица в потоке.
- 62 - это последний PPS перед прибытием первого SPS.
- существует много PPS даже до 62.
- поток битов заканчивается на # 103.
- , играющих в VL C поток длится 20 секунд.
У меня есть несколько вещей, которые нужно очистить:
- единицы # 62 и # 66 sps / pps (или любые другие) удерживая метаданные только для следующих следующих кадров, или они могут даже ссылаться на предыдущие кадры?
- VL C воспроизводит 20 секунд, возможно ли, что он сканирует весь файл раньше, а затем воспроизводит кадры из № 1 на основе № 62 и № 66 информации? - если VL C получит файл в виде потока, в этом случае он может воспроизвести всего несколько секунд (# 66 - # 103).
- самое важное: что мне делать с парсером битового потока, чтобы HTML5 видео воспроизводило эти данные? Должен ли я бросить все юниты до # 62? Или до # 66?
Теперь я действительно потерялся в этой топи c. Я создал видео с помощью FFMPEG, но на этот раз я позволил ему завершить sh его функцию avformat_find_stream_info.
Сохранил видео теми же методами, что и ранее. VL C теперь воспроизводит 18 секунд (это нормально, у меня ограничение в 1000 кадров в команде ffmpeg).
Однако давайте теперь посмотрим информацию о битовом потоке:
Теперь PPS и SPS равны 130 и 133 соответственно. Это привело к потоку, который на 2 сек c короче, чем раньше. (Думаю)
Теперь я узнал, что в правильно проанализированном h264 до первого SPS (/ PPS) все еще может быть много блоков.
SO Я хотел бы уточнить мой вопрос выше: что мне делать с парсером битового потока, чтобы HTML5 воспроизводил видео эти данные?
Также парсер битового потока, который я нашел, не очень хорош, потому что он использует двоичную оболочку => она не может быть запущена исключительно на стороне клиента.
Я смотрю на mp4box сейчас.