使用 h265 编解码器生成 hls 流

使用 h265 编解码器生成 hls 流

我正在尝试将h264视频转换为使用编解码器的 hls 流h265。因为这个bitmovin文章建议,我们需要使用fragmented mp4hls/h265流才能在 Safari 上运行。

  1. 我可以使用此命令正确转换h264h265

    ffmpeg -i input.mp4 -c:v libx265 -tag:v hvc1 out.mp4
    
  2. 我可以使用此命令将输入​​视频 ( h264) 转换为 hls ( )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

这可能是什么问题?

答案1

我今天在 macOS 10.14.3 上使用 ffmpeg 4.1.1 对此进行了测试,它似乎运行良好。我确实必须先转码为 MP4(在转码阶段不能直接转到 HLS 清单,因为生成的 m3u8 无法在 Safari 中播放 - 似乎是 ffmpeg 的一个错误),但打包功能似乎运行良好,我能够在 macOS 10.14.3 和 iOS 12.1.2 上的 Safari 中播放生成的 HEVC HLS m3u8(甚至是 UHDp60 HDR10 - 尽管在我的 iPhone XS Max 上有相当多的缓冲,并且在 macOS 中没有色调映射显示)。

如上所述,我首先需要转码为 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

这些步骤的输出生成了所有必要的文件,以便能够登录我的网络服务器并在 Safari 中自动播放 HLS 播放列表。Safari 现在甚至可以播放来自网络服务器的流式 HEVC HDR10 MP4 文件。所以我建议先尝试这样做 - 如果您的原始 MP4 无法通过网络服务器在 Safari 中播放,那么它的 HLS 打包也不太可能播放。

答案2

我也遇到了让 ffmpeg 生成有效的 HLS 播放列表的问题,其中 HEVC/h265 文件版本为 4.3.2,可在 Safari 中播放。不过 VLC 可以很好地播放它们。升级到 ffmpeg v4.4 似乎也会完全破坏 h264 文件的 HLS 生成。

我最终只是让 ffmpeg 帮我转码为 hevc,然后使用便当4将其分段(使用 bento's mp4fragment),然后为我生成 HLS 播放列表(使用启用了mp4dash--hls选项的 bento's)

相关内容