使用 h265 编解码器生成 hls 流

for*_*aka 10 ffmpeg streaming h.265 hls

我正在尝试将h264视频转换为使用h265编解码器的 hls 流。由于这bitmovin文章指出,我们需要使用fragmented mp4hls/h265流工作在Safari。

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

    ffmpeg -i input.mp4 -c:v libx265 -tag:v hvc1 out.mp4
    
    Run Code Online (Sandbox Code Playgroud)
  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
    
    Run Code Online (Sandbox Code Playgroud)

现在,当我通过指定使用上述命令时h265,输出 hls 流在 Safari 中不起作用。它抛出这个错误

Plugin Handled Load
Run Code Online (Sandbox Code Playgroud)

命令

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
Run Code Online (Sandbox Code Playgroud)

这里可能有什么问题?

小智 3

我今天在 macOS 10.14.3 上使用 ffmpeg 4.1.1 对此进行了测试,它似乎工作得很好。我确实必须首先转码为 MP4(在转码阶段不能直接转至 HLS 清单,因为生成的 m3u8 在 Safari \xe2\x80\x93 中无法播放,看起来像是一个 ffmpeg bug),但打包功能出现工作得很好,我能够播放生成的 HEVC HLS m3u8(在 UHDp60 HDR10 中甚至 \xe2\x80\x93,尽管在我的 iPhone XS Max 上有相当多的缓冲,并且在 macOS 上有非色调映射显示)在 macOS 10.14.3 和 iOS 12.1.2 上的 Safari 中。

\n\n

如上所述,我首先需要转码为 MP4(以下示例采用 UHDp60 HEVC HDR10 输入并转码为 1080p60 HEVC HDR10):

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

然后,我可以根据生成的文件进行 HLS 打包:

\n\n
ffmpeg -y -i ~/Sites/HLS/1080p/HDR10.mp4 -c copy \\\n    -hls_segment_type fmp4 -hls_time 6 -hls_list_size 10 \\\n    -hls_flags delete_segments+append_list+split_by_time \\\n    -hls_playlist_type vod ~/Sites/HLS/1080p/HDR10.m3u8\n
Run Code Online (Sandbox Code Playgroud)\n\n

这些步骤的输出会生成所有必要的文件,以便能够登录到我的 Web 服务器并在 Safari 中自动播放 HLS 播放列表。Safari 现在甚至可以播放来自 Web 服务器的流式 HEVC HDR10 MP4 文件。因此,我建议首先尝试执行此操作 \xe2\x80\x93 如果您的原始 MP4 无法通过 Web 服务器在 Safari 中播放,那么它的 HLS 打包也不太可能会播放。

\n