什么是视频关键帧?流媒体服务器如何提取视频的关键帧?
我上⼀篇⽂章写了关于视频直播点播服务器中调整关键帧间隔的⽅法,同时也发现也是有⼀部分的开发者是有这个需求的。我记得之前我粗略写过I帧的判断:,但也是粗略的写了⼀下,本篇⽂章我决定就关键帧来做个详细点的说明,最基本的就是——什么是关键帧。
关键帧,就是说这⼀帧是连接两段不同的内容,这⼀帧后⾯的视频内容会有新的变化或过渡;在时间轴上这⼀帧带有⼩⿊点标志;空⽩关键帧,跟关键帧作⽤相同,但是这⼀帧没有内容,在时间轴上,这⼀帧没有⼩⿊点标志;在这⼀帧填充内容后,就变成关键帧了;普通帧是⽤来计量播放时间或过渡时间⽤的,不能⼿动设置普通帧的内容,它是播放过程中由前后关键帧以及过渡类型⾃动填充的,⼿动插⼊或删除普通帧,会改变前后两个关键帧之间的过渡时间。
视频关键帧分为I帧,P帧,B帧,这⾥介绍下区别,也是我搜索得到的,仅供参考。I帧才是关键帧,P,B算不上关键帧。
I帧是帧内压缩编码得到的,通常是每个GOP组的第⼀帧/基础帧,在⼀组中只有⼀个I帧,I帧所占信息量⼤,解码时仅有I帧即可完整重构图像,所以才叫关键帧。
P帧与B帧是帧间压缩,P帧没有完整图像数据,只有与前⼀帧的差别信息,因此也叫预测帧,B帧则是考虑前后帧的差别(故⽽也叫双向预测帧),因此B帧解码时间最长,压缩⽐最⼤。
那怎么提取视频的关键帧呢?其实提取关键帧⽐提取视频帧快很多倍,下⾯我就基于Android系统来讲⼀下提取视频帧的⽅法:
第⼀个参数
是传⼊截取时间,只能是us(微秒)
第⼆个参数
OPTION_CLOSEST
在给定的时间,检索最近⼀个帧,这个帧不⼀定是关键帧。
OPTION_CLOSEST_SYNC
在给定的时间,检索最近⼀个同步与数据源相关联的的帧(关键帧)。
OPTION_NEXT_SYNC
在给定时间之后检索⼀个同步与数据源相关联的关键帧。
OPTION_PREVIOUS_SYNC
在给定时间之前检索⼀个同步与数据源相关的关键帧
这⾥为了提取我们想要的帧,不使⽤关键帧,所以⽤ OPTION_CLOSEST
public Bitmap getFrameAtTime()
//如果不加参数的话,提取第⼀个关键帧
public Bitmap getFrameAtTime() {
return getFrameAtTime(-1, OPTION_CLOSEST_SYNC);
}
/**
* 获取视频⽂件截图
*
* @param path 视频⽂件的路径
* @return Bitmap 返回获取的Bitmap
*/
public Bitmap getVideoThumb(String path) {
MediaMetadataRetriever media = new MediaMetadataRetriever();
media.setDataSource(path);
option是什么意思啊Bitmap frameAtTime = FrameAtTime(1 * 1000 * 1000, MediaMetadataRetriever.OPTION_CLOSEST);
if (frameAtTime == null) {
frameAtTime = FrameAtTime(3 * 1000 * 1000, MediaMetadataRetriever.OPTION_CLOSEST);
}
return frameAtTime;
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论