Генерация потока hls с использованием кодека h265

Я пытаюсь конвертировать h264 видео в поток HLS, который использует h265 кодек. Как следует из этой статьи, мы должны использовать fragmented mp4 для hls/h265 стрим для работы на сафари.

  1. Я могу конвертировать h264 в h265 правильно используя эту команду

    ffmpeg -i input.mp4 -c:v libx265 -tag:v hvc1 out.mp4
    
  2. Я могу конвертировать входное видео (h264) в глс (fragmented mp4) используя эту команду

    ffmpeg -y -i input.mp4 \
        -c copy -hls_segment_type fmp4 -hls_time 6 -hls_list_size 10 \
        -hls_flags delete_segments+append_list+split_by_time \ 
        -hls_playlist_type vod manifest.m3u8
    

Теперь, когда я использую приведенную выше команду, указав h265, выходной поток hls не работает в Safari. Выкидывает эту ошибку

Plugin Handled Load

команда

ffmpeg -y -i input.mp4 \
    -vf scale=640:360 -c:v libx265 -tag:v hvc1 -c:a copy \
    -hls_segment_type fmp4 -hls_time 6 -hls_list_size 10 \
    -hls_flags delete_segments+append_list+split_by_time \
    -hls_playlist_type vod manifest.m3u8

В чем может быть проблема здесь?

2 ответа

Сегодня я протестировал это с ffmpeg 4.1.1 на macOS 10.14.3, и, похоже, он прекрасно работает. Сначала мне нужно перекодировать в MP4 (нельзя просто перейти непосредственно к манифесту HLS на этапе транскодирования, так как результирующий m3u8 не воспроизводится в Safari - это похоже на ошибку ffmpeg), но функция упаковки, кажется, работает отлично, и Я могу воспроизвести получившийся HEVC HLS m3u8 (даже в UHDp60 HDR10 - хотя и с довольно небольшой буферизацией на моем iPhone XS Max и нетонографическим отображением в macOS) в Safari как на macOS 10.14.3, так и на iOS 12.1. 0,2.

Как указано выше, мне сначала нужно перекодировать в MP4 (в следующем примере используется вход UHDp60 HEVC HDR10 и транскодирование в 1080p60 HEVC HDR10):

ffmpeg -y -i source.mp4 -c:v libx265              \
    -tag:v hvc1 -pix_fmt yuv420p10le -s 1920x1080 \
    -x265-params "colorprim=bt2020:transfer=smpte2084:colormatrix=bt2020nc:bitrate=4000:keyint=120:strict-cbr" \
    -c:a copy ~/Sites/HLS/1080p/HDR10.mp4

Из полученного файла я могу сделать упаковку HLS:

ffmpeg -y -i ~/Sites/HLS/1080p/HDR10.mp4 -c copy \
    -hls_segment_type fmp4 -hls_time 6 -hls_list_size 10 \
    -hls_flags delete_segments+append_list+split_by_time \
    -hls_playlist_type vod ~/Sites/HLS/1080p/HDR10.m3u8

В результате этих шагов создаются все необходимые файлы, чтобы иметь возможность войти на мой веб-сервер и автоматически воспроизвести список воспроизведения HLS в Safari. Safari теперь может даже воспроизводить потоковые файлы HEVC HDR10 MP4 с веб-сервера. Поэтому я бы предложил сначала попытаться сделать это - если ваш оригинальный MP4 не воспроизводится в Safari через веб-сервер, то маловероятно, что его упаковка HLS тоже подойдет.

У меня также возникли проблемы с созданием ffmpeg действующего списка воспроизведения HLS с файлами HEVC/h265 версии 4.3.2, которые будут воспроизводиться в Safari. Хотя VLC их воспроизводит нормально. Обновление до ffmpeg v4.4 также, похоже, полностью нарушает генерацию HLS для файлов h264.

В итоге я просто позволил ffmpeg перекодировать в hevc, а затем использовал bento4 для его фрагментации (используя bentomp4fragment), а затем сгенерируйте для меня плейлист HLS (используя bentomp4dashс--hlsопция включена)

Другие вопросы по тегам