ffmpeg 下实现 h265 hevc编码的 hls 服务的过程一些收藏和介绍

现状: 

很多关于 h264生成 hls 的m3u8文章,但如果生成的是 h265的介绍还很少,对于此一般来说是一句简单的说明就是使用:

hevc_mp4代替h264_mp4toannexb即可,便于更多的介绍.

关于这个有一篇比较详细的中文介绍在这里:

https://blog.csdn.net/weixin_41422027/article/details/106649361

但没有给出具体的命令行参数.

官方对于此参数的一些介绍:

https://www.ffmpeg.org/ffmpeg-bitstream-filters.html#hevc_005fmp4toannexb

https://ffmpeg.org/ffmpeg-formats.html


https://developer.apple.com/documentation/http_live_streaming/http_live_streaming_hls_authoring_specification_for_apple_devices



也没有提及 hevc 的情况.

苹果也给出了解决方案,使用他们的mediafilesegmenter这一个命令,但这个命令的兼容性比较差,就是 iPhone 拍摄的视频都无法支持.

https://qiita.com/makotok7/items/bbcd24ab7b00adf8cc92  这里有一篇日文的文章介绍了使用说明

[email protected] hls % mediafilesegmenter IMG_3337.MOV 

Apr  9 2022 02:22:09.357: Processing file /Users/jeffcheng/Downloads/hls/IMG_3337.MOV

Apr  9 2022 02:22:09.374: Fragmented MP4 is the only supported container format for the segmentation of HEVC content

Apr  9 2022 02:22:09.374: Unsupported media type 'hvc1' in track 0

Apr  9 2022 02:22:09.374: Unable to find any valid tracks to segment.

Segmenting failed (-12780).





Bento4 这个网站提供了些工具,还没有试,软件还没有完全安装成功,因为我主要希望能通过 ffmpeg 来实现
https://www.bento4.com

这是一篇介绍把视频转成 HDR 的文章,还不错,和本文的转成 m3u8没有关系
https://codecalamity.com/encoding-uhd-4k-hdr10-videos-with-ffmpeg/


这个人写的中文文章关于 ffmpeg的介绍 还不错,收藏一下
https://blog.csdn.net/langzijing/article/details/85256846

这里提及到到了,还没有试,
https://nico-lab.net/hls_muxer_with_ffmpeg/


https://superuser.com/questions/1293639/re-encode-4k-video-to-h-265-hevc-with-ffmpeg-for-playback-in-quicktime

这个是目前唯一测试成功的示例:
https://superuser.com/questions/1338231/generate-hls-stream-using-h265-codec
文章中提到:
先把文件转成:
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
再通过:
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
生成 list
我在测试中,第一步 :strict-cbr 加上以后就无法运行,且在官网客个版本 ffmpeg 的编译下 都不行.
而且我把一段 原文件是 h265,hdr,10bits 的mkv 文件通过第一步转成 mp4,在第二步生成的文件是无法在 Safari 里播放的,
但是把这个 mkv 文件直接通过第二步是成功的,仔细比较过,也没有发现有什么区别,就卡在这里了.
2022.4.10继续找
最终却使用显卡的硬解码还能实现了:
ffmpeg -y -c:v hevc_cuvid  -resize 1920x1024 -i img_3337.mov  -c:v hevc_nvenc -b:v 3M  -hls_segment_type fmp4 -hls_time 15  -hls_list_size 0     -hls_flags delete_segments+append_list+split_by_time  -hls_playlist_type vod 1.m3u8 
以上的命令是能在 safari 里能跑了,因为是使用的 fmp4的方式,它会生成一个 init.mp4的文件,在网上找了一下,对于这个文件中包含了核心的总的视频信息索引.

但似乎对于我的项目中不可用,苹果是这么要求的:

1.5. The container format for HEVC video MUST be fMP4.

而我的项目目录只能使用 mpegts.

接下来得继续找方式.

这个人讲了一些关于实时切片的文章
https://zhuanlan.zhihu.com/p/366733999
这个文章讲了一些关于 fmp4的区别,计划这里入手
https://zhuanlan.zhihu.com/p/358488699
2022.4.12 继续测试
今天尝试加上 single_file 时又不能在 safari 里播放了.
原因未明.




评论

不知道有没有最新的update?我也一直在找一个合适的方式,一直没有答案。

此博客中的热门博文

在南京见到的农民工午饭情景

RamDisk三种实现方式

squid中的refresh_pattern详解