Я создаю фрагментированный mp4 для потоковой передачи html5, используя следующую команду:
-i rtsp://172.20.28.52:554/h264 -vcodec copy -an -f mp4 -reset_timestamps 1 -movflags empty_moov+default_base_moof+frag_keyframe -loglevel quiet -
- «-i rtsp://172.20.28.52:554/h264», потому что источником является h264 в потоке rtp-пакетов с ip-камеры. Ради тестирования камера установлена с GOP 1 (т.е. все кадры являются ключевыми).
- "-vcodec copy", потому что мне не нужно транскодирование, только ремикс в mp4.
- «-movflags empty_moov+default_base_moof+frag_keyframe», чтобы создать фрагментированный mp4 в соответствии со спецификацией расширений источника мультимедиа.
- «-» в конце для вывода mp4 на стандартный вывод. Я получаю вывод и отправляю его веб-клиенту через веб-сокеты.
Все работает хорошо, за исключением проблемы с задержкой, которую я пытаюсь решить. Если я регистрирую каждый раз, когда данные поступают из стандартного вывода, с отметкой времени поступления, я получаю следующий вывод:
16/06/2015 15:40:45.239 получил размер данных = 24
06.16.2015 15:40:45.240 получил размер данных = 7197
06.16.2015 15:40:45.241 получил размер данных = 32768
16/06/2015 15:40:45.241 получил размер данных = 4941
06.16.2015 15:40:45.241 получил размер данных = 12606
06.16.2015 15:40:45.241 получил размер данных = 6345
06.16.2015 15:40:45.241 получил размер данных = 6339
06.16.2015 15:40:45.242 получил размер данных = 6336
06.16.2015 15:40:45.242 получил размер данных = 6361
06.16.2015 15:40:45.242 получил размер данных = 6337
06.16.2015 15:40:45.242 получил размер данных = 6331
06.16.2015 15:40:45.242 получил размер данных = 6359
06.16.2015 15:40:45.243 получил размер данных = 6346
06.16.2015 15:40:45.243 получил размер данных = 6336
16/06/2015 15:40:45.243 получил размер данных = 6338
06.16.2015 15:40:45.243 получил размер данных = 6357
06.16.2015 15:40:45.243 получил размер данных = 6357
06.16.2015 15:40:45.243 получил размер данных = 6322
06.16.2015 15:40:45.243 получил размер данных = 6359
06.16.2015 15:40:45.244 получил размер данных = 6349
06.16.2015 15:40:45.244 получил размер данных = 6353
06.16.2015 15:40:45.244 получил размер данных = 6382
06.16.2015 15:40:45.244 получил размер данных = 6403
06.16.2015 15:40:45.304 получил размер данных = 6393
06.16.2015 15:40:45.371 получил размер данных = 6372
06.16.2015 15:40:45.437 получил размер данных = 6345
06.16.2015 15:40:45.504 получил размер данных = 6352
06.16.2015 15:40:45.571 получил размер данных = 6340
16/06/2015 15:40:45.637 получил размер данных = 6331
06.16.2015 15:40:45.704 получил размер данных = 6326
06.16.2015 15:40:45.771 получил размер данных = 6360
16/06/2015 15:40:45.838 получил размер данных = 6294
06.16.2015 15:40:45.904 получил размер данных = 6328
06.16.2015 15:40:45.971 получил размер данных = 6326
06.16.2015 15:40:46.038 получил размер данных = 6326
06.16.2015 15:40:46.105 получил размер данных = 6340
06.16.2015 15:40:46.171 получил размер данных = 6341
06.16.2015 15:40:46.238 получил размер данных = 6332
Как вы можете видеть, первые 23 строки (которые содержат данные примерно 1,5 секунды видео) поступают почти мгновенно, а затем задержка между каждыми двумя последовательными строками составляет ~ 70 мс, что имеет смысл, поскольку видео составляет 15 кадров в секунду. Такое поведение приводит к задержке около 1,5 с.
Это похоже на проблему с очисткой, потому что я не вижу причин, по которым ffmpeg должен хранить первые 23 кадра в памяти, тем более что каждый кадр является собственным фрагментом внутри mp4. Однако я не смог найти какой-либо метод, который заставил бы ffmpeg быстрее сбрасывать эти данные.
У кого-нибудь есть предложение?
Я хотел бы отметить, что это дополнительный вопрос к этому: контент с использованием mp4box
blocksize
, используемым для буферизации вывода. Проверьте ffmpeg.org/ffmpeg-all.html#toc-pipe. и посмотрите, поможет ли вам настройка этого значения. - person Pablo Montilla   schedule 16.06.2015ffmpeg
, всегда получаюSkipping unrecognized top-level box: ftyp
. (IP-камера h264). Я также пытался изменить-vcodec
наlibx264
, в этом случае я получаюSkipping unrecognized top-level box: mdat
. Не могли бы вы описать свой код подробнее или указать его где-нибудь? Самая интересная часть — это параметр.addSourceBuffer
, то есть строка кодека. Заранее спасибо! - person zarkone   schedule 19.06.2015