Как создать прямой эфир (трансляция) http из сегментированного mp4 без дефектов звука - PullRequest
0 голосов
/ 11 февраля 2019

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

Моя проблема в том, что у меня нет всего видео.Его порция генерируется фрагментом.

1 Ответ

0 голосов
/ 24 мая 2019

Проблема в том, что AAC не является дружественным форматом для простого объединения отдельных кодированных фрагментов.AAC всегда кратно 1024 выборкам.Если ваши аудиоблоки имеют частоту 1025 сэмплов, результирующий код будет дополнен до 2048, и вы получите 1023 сэмпла тишины.Обычно вы не представляете, как много тишины.Таким образом, вы должны поддерживать процесс кодирования ffmpeg для всех фрагментов.Если вы работаете в Unix, создайте конвейер имен, направьте видео в именованный конвейер и прочитайте ffmpeg из конвейера имен.

mkfifo my_pipe
cat my_file > my_pipe
ffmpeg -re -i my_pipe // and some more
...