ffmpeg插入sei实践
本文章主要讲述如何修改ffmpeg源码,实现在每个关键帧中插入sei。
原始Bsf
BitStream Filter(码流过滤)的缩写为bsf,它的作用是,在不做码流解码的前提下,对已经编码后的比特流做特定的修改、调整。
bsf h264_metadata的调用
使用ffmpeg工具时,可以使用比特流过滤器。基本的filter调用格式如下:
1 | ffmpeg -i INPUT -c:v copy -bsf:v filter1[=opt1=str1:opt2=str2][,filter2] OUTPUT |
可以使用 h264_metadata比特流过滤器添加SEI。下面示例命令添加了类型为未注册的用户数据的SEI,其中uuid为”086f3693-b7b3-4f2c-9653-21492feee5b8”,payload内容为”hello”:
1 | ./ffmpeg -I oceans.h264 -c:v copy -bsf:v h264_metadata=sei_user_data='086f3693-b7b3-4f2c-9653-21492feee5b8+hello' oceans.sei.h264 |
Bsf修改
修改文件为h264_metadata_bsf.c
查找出关键帧
from
1 | has_sps = 0; |
to
1 | int has_idr = 0; |
判断是关键帧
from
1 | // Only insert the SEI in access units containing SPSs, and also |
to
1 | // Only insert the SEI in access units containing IDRs, and also |
在关键帧后插入一帧SEI
当参数为“**-bsf:v h264_metadata=sei_user_data=’086f3693-b7b3-4f2c-9653-21492feee5b8+{timestamp}’**”时插入当前时间戳。
解析出的SEI信息为”ts:timestamp”精确到毫秒
from
1 | udu->data = udu->data_ref->data; |
to
1 | udu->data = udu->data_ref->data; |
调试方法
使用xcode
- https://www.jianshu.com/p/226c19aa6e42
- https://blog.f-fox.com/2019/03/06/%E4%BD%BF%E7%94%A8Xcode%E6%96%AD%E7%82%B9%E8%B0%83%E8%AF%95ffmpeg/
使用方法
1 | -bsf:v h264_metadata=sei_user_data='086f3693-b7b3-4f2c-9653-21492feee5b8+{timestamp}' |
栗子:
1 | -stream_loop -1 -i video.mp4 -c:a aac -c:v libx264 -bsf:v h264_metadata=sei_user_data='086f3693-b7b3-4f2c-9653-21492feee5b8+{timestamp}' -f flv rtmp://demo-push.cn/live/11 |