月度归档:2022年07月

m3u8 广告h.264

请务必使用H。264编码 ,两个文件都得使用h.264 使用fmp4 无法跳转

使用标签
#EXT-X-DISCONTINUITY

若使用嵌入图片实时替换则对一个TS文件转码,切记为h.264

添加水印:

ffmpeg -i d20.ts -vf "movie=a.jpeg[watermark];[in][watermark] overlay=main_w-overlay_w-10:main_h-overlay_h-10[out] " -c:v libx264 d30.ts
切记编码格式不能用copy 必须手动制定
建议将切片设置为10秒 则插入广告 时间较多

图片在视频的位置为左下角
main_w-overlay_w-10 : 水印在x轴的位置,也可以写成x=main_w-overlay_w-10

main_h-overlay_h-10:水印在y轴的位置

ffmpeg -i d20.ts -c:v libx264  -vf "drawtext=text=首家线上堵车疏通平台上线了 :expansion=normal:fontfile=simkai.ttf: y=h-line_h-10:x=(mod(5*n\,w+tw)-tw): fontcolor=white: fontsize=40: shadowx=2: shadowy=2" d30.ts

下面 从左向右文字显示 白色 字体大小 40 字体simkai.tff文件请拷贝到执行目录

:y=h-line_h-10:x=w-(t-4.5)*w/5.5:从右向左
: y=h-line_h-10:x=(mod(5*n\,w+tw)-tw):从左向右

hevc 的hev1与hvc1

265即 HEVC,在打包成mp4时需要有 codec tag。hev1 or hvc1是两种codec tag,表示mp4容器中hevc流的不同打包方式。Quicktime Player和iOS不支持hev1
默认是hev1,需要使用ffmpeg修改

ffmpeg -i input-hev1.mp4 -c:v libx265 -tag:v hvc1 -c:a copy output-hvc1.mp4

#h.265 fmp4
 ffmpeg -i d1.mp4 -c copy -hls_time 4 -f hls -hls_playlist_type vod  -hls_segment_type fmp4  d.m3u8

#h.264 TS
ffmpeg -i 12.mp4 -vcodec copy -acodec copy -f hls -hls_time 3 -hls_list_size 0 -y m3u8

转码切片ffmpeg h.265 手札

转码

ffmpeg -i c.mp4 -c:v libx265 -c:a aac -strict -2 -hls_time 4 -hls_list_size 6 -f hls c.m3u8

若使用了-hls_segment_type fmp4 则必定生成init.mp4 ,虽然可以节约空间,起到一定的加密功能。以上切片为ts,切片,单ts文件就可以播放。不使用fmp4切片的H.265视频,apple可能不支持播放。

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:17
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:17.333911,
c0.ts
#EXTINF:9.754711,
c1.ts
#EXT-X-ENDLIST

-hls_segment_type fmp4 使用了 可以指定初始mp4文件使用-hls_fmp4_init_filename init.mp4init.mp4可以修改为你要的存储的地方。

ffmpeg -i x.mp4 -c:v libx265 -c:a aac -strict -2 -hls_time 4 -hls_list_size 6 -f hls  -hls_segment_type fmp4 -hls_fmp4_init_filename x.mp4 x.m3u8

m3u8文件解析H.265

M3U8文件中仅有3个类型的数据
URI
空行
#开头的行
#EXT开头的为 大小写敏感,且为M3U8处理数据

#EXT-X-VERSION:7 版本号为7
#EXT-X-TARGETDURATION:20 最长切片20秒
#EXT-X-PLAYLIST-TYPE:VOD 视频类型,VOD为点播,EVENT为直播,且不存在结束标签#EXT-X-ENDLIST
#EXTINF:2.627625, 切片时长2.627625秒

广告

#EXT-X-DISCONTINUITY 用于插入切片广告,表示与其上一段的视频码参数或者序列什么的不同。

#EXTINF:8.0,
v1.ts
#更换到广告
#EXT-X-DISCONTINUITY
#EXTINF:10.0,
Ad1.ts
#EXTINF:10.0,
Ad2.ts
#广告结束更换会原来的源头
#EXT-X-DISCONTINUITY
#EXTINF:8.0,
v2.ts
#EXTINF:8.0,
v3.ts


范例

“` #EXTM3U
#EXT-X-VERSION:7
#EXT-X-TARGETDURATION:20
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-MAP:URI="init.mp4"
#EXTINF:5.005000,
10.m4s
#EXTINF:11.261250,
11.m4s
#EXTINF:13.513500,
12.m4s
#EXTINF:3.253250,
13.m4s
#EXTINF:3.253250,
……
1267.m4s
#EXTINF:9.009000,
1268.m4s
#EXTINF:20.020000,
1269.m4s
#EXTINF:2.627625,
1270.m4s
1267.m4s
#EXTINF:9.009000,
1268.m4s
#EXTINF:20.020000,
1269.m4s
#EXTINF:2.627625,
1270.m4s
#EXT-X-ENDLIST

<pre><code class=""><br /><br />#### 开始标志
</code></pre>

#EXTM3U
#EXT-X-VERSION:7
#EXT-X-TARGETDURATION:20 #切片最大视频长度
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-MAP:URI="init.mp4"

<pre><code class="">#### 切片视频:
</code></pre>

#EXTINF:9.009000,
1268.m4s
“`
#EXTINF: 每个切片的时间 (ckplayer下删除可以使用)
切片视频地址(hls下会使用ajax传输)

结束标志 #EXT-X-ENDLIST 删除可以播放

#EXT-X-MAP:URI=”init.mp4″ 删除此行无法使用,但可以在其中加入参数如#EXT-X-MAP:URI=”init.mp4?key=bsdhabhsb121″

这个字段是视频的初始化片段, 简而言之,有了这个字段,说明后续的每一个分片文件必须和通过这个初始化片段才能完整解读,缺少这个初始化片段, M3U8视频根本播放不了.

可以对切片视频地址加入相应的参数?key=1263716371

m3u8 文件可以使用即时生成文件,组合相应的切片视频


ffmpeg 切片加密 手札

需要一个通用的KEY和一个IV
生成KEY

openssl rand -base64 20 > enc.key 

生成IV

openssl rand -hex 16

新建一个文件enc.keyinfo 内容格式如下:

Key URI # enc.key的路径,使用http形式
Path to key file # enc.key文件
IV # 上面生成的iv

播放是通过M3U8文件得到需要HTTP(即第一行的 Key URI)访问的key,然后取得key,进行解码访问。

http://edu.gamagou.cn/enc.key
/usr/share/nginx/html/enc.key
682f5033538cf71567e1bdb38f5f9a07

enc.keyinfo仅用于视频切片,可以多个视频都用一个文件进行切片

ffmpeg -y -i input.mp4 -hls_time 12 -hls_key_info_file enc.keyinfo -hls_playlist_type vod -hls_segment_filename "file%d.ts" playlist.m3u8

建议还是先转码后再切片。