FFMpeg генерирует сегментированные видео m3u8 с большой задержкой перед началом воспроизведения

1251
Michael Gaylord

Я использую ffmpeg для генерации сегментированного списка файлов, чтобы передать их в приложение для iOS. Список файлов генерируется нормально, но когда приходит время их воспроизвести, видео необходимо полностью загрузить перед началом воспроизведения. Такое поведение, похоже, имеет место на iOS, Safari и VLC.

Кто-нибудь знает, почему это происходит и как я могу улучшить производительность воспроизведения? У меня есть полный контроль над тем, как файлы записываются в iOS, а также как они обрабатываются. Вот пример потока:

http://www.bytesizecreations.com/storie-test/hls.m3u8

Вот мои команды ffmpeg для генерации сегментов из файла:

ffmpeg -i joined.ts -flags -global_header -vcodec copy -acodec copy -map 0 -f segment -segment_time 2 -segment_list hls.m3u8 -segment_list_size 999999 -segment_format mpegts out%03d.ts 

Вот вывод ffprobe для файла:

 libavutil 54. 7.100 / 54. 7.100 libavcodec 56. 1.100 / 56. 1.100 libavformat 56. 4.101 / 56. 4.101 libavdevice 56. 0.100 / 56. 0.100 libavfilter 5. 1.100 / 5. 1.100 libavresample 2. 1. 0 / 2. 1. 0 libswscale 3. 0.100 / 3. 0.100 libswresample 1. 1.100 / 1. 1.100 libpostproc 53. 0.100 / 53. 0.100 Input #0, mpegts, from 'joined.ts': Duration: 00:00:07.96, start: 1.441667, bitrate: 3899 kb/s Program 1  Metadata: service_name : Service01 service_provider: FFmpeg Stream #0:0[0x100]: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p, 1280x720, 24 fps, 24 tbr, 90k tbn, 180k tbc Stream #0:1[0x101](und): Audio: aac ([15][0][0][0] / 0x000F), 44100 Hz, stereo, fltp, 222 kb/s 
1

1 ответ на вопрос

0
Michael Gaylord

Для обеспечения высокой производительности потокового видео должен быть набор из нескольких вариантов видеопотоков. Другими словами, видео, закодированные с различными битрейтами и разрешениями, на которые все ссылаются из файла списка воспроизведения (.m3u8)

Видеопроигрыватели, которые поддерживают потоки с адаптивным битрейтом, затем выберут поток, который соответствует вашему сетевому соединению, и смогут плавно переключать потоки при изменении условий сети. Причиной того, что видео, которое я пытался транслировать, потребовалось так много времени, чтобы начать воспроизведение, было то, что у меня был только один поток с разрешением 720p, поэтому проигрывателю потребовалось очень много времени для буферизации, прежде чем он начал воспроизводиться.

Я использовал стандарт Http Live Streaming (HLS), созданный Apple, для создания адаптивного потока битрейта с 5 потоками (который я сгенерировал с помощью ffmpeg), и мое видео начинает воспроизводиться практически сразу.

Бесстыдный плагин: чтобы сделать это проще для разработчиков и других пользователей, я упаковал инфраструктуру, которую мы собрали для генерации потоков HLS, с iOS SDK, который вы можете проверить здесь: https://github.com/Storie/StorieCloudSDK

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