I am trying to convert h264
video to an hls stream which uses h265
codec. As this bitmovin article suggests, we need to use fragmented mp4
for the hls/h265
stream to work on safari.
-
I am able to convert
h264
toh265
properly using this commandffmpeg -i input.mp4 -c:v libx265 -tag:v hvc1 out.mp4
-
I am able to convert an input video (
h264
) to hls (fragmented mp4
) using this commandffmpeg -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
Now when I use the above command by specifying h265
, the output hls stream does not work in Safari. It throws this error
Plugin Handled Load
Command
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
What might be the issue here?
Best Answer
I tested this with ffmpeg 4.1.1 today on macOS 10.14.3, and it seems to work beautifully. I do have to transcode to an MP4 initially (can't just go direct to HLS manifest during the transcode stage as the resulting m3u8 is unplayable in Safari – seems like a ffmpeg bug), but the packaging function appears to work perfectly well, and I am able to play the resulting HEVC HLS m3u8 (in UHDp60 HDR10 even – albeit with quite a bit of buffering on my iPhone XS Max and a non-tone-mapped display in macOS) in Safari on both macOS 10.14.3 and iOS 12.1.2.
As stated above, I first need to transcode to MP4 (the following example takes a UHDp60 HEVC HDR10 input and transcodes to 1080p60 HEVC HDR10):
From the resulting file, I can then do the HLS packaging:
The output from these steps produces all the necessary files to be able to logon to my web server and automatically play the HLS playlist in Safari. Safari can even play streamed HEVC HDR10 MP4 files from a web server now. So I would suggest attempting to do that first – if your original MP4 doesn't play in Safari via the web server, then it is unlikely that an HLS packaging of it will either.