我正在尝试将h264
视频转换为使用编解码器的 hls 流h265
。因为这个bitmovin文章建议,我们需要使用fragmented mp4
该hls/h265
流才能在 Safari 上运行。
我可以使用此命令正确转换
h264
为h265
ffmpeg -i input.mp4 -c:v libx265 -tag:v hvc1 out.mp4
我可以使用此命令将输入视频 (
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)