tl; dr - объединение независимых коротких видео в плейлист hls создает дефекты звука.Звук «Тик» в точке объединения.Как мне избежать этого?
У меня есть процесс, который испускает 4-секундное видео MOV каждые 3 секунды.Эти видео 4s являются сегментами более длинного видео.Но они полностью независимы.Я хочу иметь возможность проигрывать более длинное видео до того, как оно появится.Чтобы добиться этого, я создаю список воспроизведения даже по HLS Список событий hls Сначала я конвертирую первое видео 4s в hls, используя ffmpeg, запустив:
fmpeg -y -i output0.mov -c:a aac -b:a 128000 -r:a 44100 -c:v libx264 -x264-params keyint=150:scenecut=0 -hls_flags omit_endlist -hls_playlist_type -b:t 800k -maxrate 2000k -bufsize 1200k -f hls -pix_fmt yuv420p -g 5 -hls_time 5 one.m3u8
, и это создаст.Файл ts и и .m3u8 список воспроизведения
#EXT-X-PLAYLIST-TYPE:EVENT
#EXT-X-TARGETDURATION:4
#EXT-X-VERSION:4
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:4.00,
part1.ts
замечают: -hls_flags omit_endlist -hls_playlist_type event
флаги.Они удостоверяются, что список воспроизведения является списком воспроизведения СОБЫТИЯ, и что в конце списка нет EXT-X-ENDLIST
(это заставляет игрока начать опрос файла .m3u8, чтобы «ждать» добавления новых фрагментов .ts ксписок воспроизведения)
Когда будет доступно следующее видео 4s, я снова запускаю команду ffmpeg.а затем «объединить» новый файл .m3u8 со старым файлом .m3u8.добавив новый файл .ts в список воспроизведения.
#EXT-X-PLAYLIST-TYPE:EVENT
#EXT-X-TARGETDURATION:4
#EXT-X-VERSION:4
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:4.00,
part1.ts <- first 4 seconds chunk
#EXTINF:4.00,
part2.ts <- second ( new ) 4 second chunk
, так как проигрыватель опрашивает файл .m3u8, когда он обновляется, он выбирает второй файл .ts (part2.ts) и воспроизводит его.
Единственная проблема - это дефект звука.точно в точке объединения двух видео.(на втором 4) в этом примере.Видео не имеет видимых дефектов.Я подозреваю, что это происходит из-за проблемы с кодировкой.(каждое видео mov кодируется в hls отдельно) Но я должен воспроизвести видео через 4 секунды.(не могу дождаться, пока все будет готово)
Что я делаю не так?Как кодировать фрагменты hls, чтобы избежать дефектов звука?
В документации ffmpeg я видел: Сегментирует входной файл и создает живой список воспроизведения M3U8 (может использоваться в качестве живого источника HLS):
ffmpeg -re -i in.mkv -codec copy -map 0 -f segment -segment_list playlist.m3u8 \
-segment_list_flags +live -segment_time 10 out%03d.mkv
Моя проблема в том, что у меня нет всего видео.Его порция генерируется фрагментом.