我使用 ffmpeg 使用以下命令将视频转换为支持 HLS 的 HEVC 编解码器:
ffmpeg -i originalName.mp4 -c:v libx265 -tag:v hvc1 -g 60 -hls_time 2 -hls_playlist_type vod -hls_segment_type fmp4 originalName-8000-fmp4-1080p.m3u8"
然后我将其上传到我的服务器并尝试播放。导航到 http://memoryprinting.sk/am/videos/test2/1_IMG_1122-8000-fmp4-1080p.m3u8,它存储在 Safari 中,仅显示损坏的播放器图标(Safari 支持播放这些),但从使用VLC播放器的相同路径可以正常工作。
我认为问题可能出在我的服务器上,但我尝试上传从其他 URL 下载的 .m3u8 视频和片段,即使在 Safari 中打开它也能正常工作。 (http://memoryprinting.sk/am/videos/test/v360p_fmp4.m3u8)
我不知道问题出在哪里。在 VSCode 中检查我的 m3u8 文件,它与另一个有效的文件具有相同的结构。
编辑:尝试在 ffmpeg 中编码为 h264 而不是 hevc,这有效。但 HEVC 本身不会成为问题,因为正在运行的视频也是基于 ffprobe 的“hvc1”(与我的视频相同)。
问题实际上出在 ffmpeg 生成的 init.mp4 上。它只是在 Safari 或 iOS AVPlayer 中不起作用。使用bento4创建HLS解决了这个问题,尽管过程有点复杂。
首先我需要使用 ffmpeg 向视频添加关键帧,因为这是我所需要的。
ffmpeg -i source.mp4 -c:v libx265 -tag:v hvc1 -g 60 -c:a copy output_keyframed.mp4
然后使用Bento4我创建了碎片mp4
mp4fragment --fragment-duration 2000 output_keyframed.mp4 fragmented.mp4
最后是 HLS 文件
mp4dash --hls fragmented.mp4
尽管将片段持续时间设置为 2000,但我无法在 HLS 中强制使用相同的片段持续时间,并且 mp4dash 没有片段持续时间的设置。因此,作为一种解决方法,我最终使用 ffmpeg 生成的 HLS,因为它提供了更多设置,但将 init.mp4 文件替换为 Bento4 创建的文件。