一、功能概览
通过抽帧接口来获取原始视频帧和编辑中的渲染帧,一般用于实现封面和时间线预览条。
二、相关接口类
| 接口类名 | 描述 |
| TAVEditor | SDK 操作入口类。 |
| ITAVFrameProvider | 帧提供器接口。 |
| TAVGetFrameListener | 帧获取回调接口。 |
| TAVSnapshotCallback | 渲染快照回调接口。 |
| ITAVThumbProvider | 视频原始帧抽帧接口。 |
三、获取指定时间点渲染结果
接口说明:
/** * 获取某一时间节点渲染结果 * * @param positionUs 时间点(微秒) * @param longSideLength 最长边的长度,SDK内部会根据长边大小计算短边的大小 * @param scene 渲染场景: * – TAVEditorConstants.SCENE_PLAY = 0:播放场景 * – TAVEditorConstants.SCENE_EXPORT = 1:导出场景 * @param listener 结果回调接口 */void getFrameAtTime( long positionUs, int longSideLength, @TAVEditorConstants.RenderScene int scene, TAVGetFrameListener listener);
使用示例:
editor.getFrameAtTime(5_000_000, 1080, TAVEditorConstants.SCENE_PLAY, new TAVGetFrameListener() { @Override public void onFrameResult(Bitmap frameBmp) { // 渲染完成回调,frameBmp 为空表示渲染失败 }});
注意:说明:
注意:TAVGetFrameListener 仅包含 onFrameResult(Bitmap) 一个回调方法。渲染场景常量为 SCENE_PLAY(0) 与 SCENE_EXPORT(1)。
四、获取渲染结果生成器
接口说明:
/** * 获取渲染结果生成器 * * @param longSideLength 会按照渲染比例缩放到长边对齐 * @param scene 渲染场景 * – TAVEditorConstants.SCENE_PLAY = 0: 播放场景 * – TAVEditorConstants.SCENE_EXPORT = 1: 导出场景 * @return ITAVFrameProvider 帧提供器实例 */ITAVFrameProvider getFrameProvider(int longSideLength, @TAVEditorConstants.RenderScene int scene);
使用示例:
ITAVFrameProvider provider = editor.getFrameProvider(720, TAVEditorConstants.SCENE_EXPORT);// 获取指定时间点的帧(ITAVFrameProvider.getFrameAtTime(long timeUs, TAVGetFrameListener))provider.getFrameAtTime(3_000_000, new TAVGetFrameListener() { @Override public void onFrameResult(Bitmap frameBmp) { // 处理帧图像 }});provider.release();
五、读取当前时间节点渲染快照
接口说明:
/** * 读取当前时间节点渲染快照 * * @param callback 快照获取成功时的回调 */void readSnapshot(TAVSnapshotCallback callback);
使用示例:
editor.readSnapshot(new TAVSnapshotCallback() { @Override public void onSnapshotResult(Bitmap snapshot, long positionUs) { // 处理快照图像与对应时间点 }});
注意:说明:
注意:回调方法为 onSnapshotResult(Bitmap snapshot, long positionUs)。
六、获取视频原始帧抽帧接口
接口说明:
/** * 获取视频原始帧抽帧接口 * * @param forceUseSoftwareDecoding 是否强制使用软解: * – true: 强制软件解码 * – false: 优先硬件解码 * @return ITAVThumbProvider 缩略图提供器实例 */ITAVThumbProvider getThumbnailProvider(boolean forceUseSoftwareDecoding);
使用示例:
ITAVThumbProvider provider = editor.getThumbnailProvider(false);// 1. 设置抽帧输入源,longSide 为目标缩略图最长边(<16 时按原始分辨率抽帧)provider.setDataSource(context.getFilesDir() + "/source.mp4", 320);// 2. 取指定时间点的帧;granularity 为帧间隔秒数(颗粒度)provider.getFrameAtTime(2_000_000, 0.1f, new ITAVThumbProvider.FrameExtractingCallback() { @Override public void onExtractedFrame(String videoPath, Bitmap frame, long pts) { // 每抽到一帧回调一次,在子线程执行;frame 为空表示抽帧失败 }});// 3. 用完释放provider.release();
ITAVThumbProvider 全部方法:
| 方法 | 说明 |
| setDataSource(String videoPath, int longSide) | 设置抽帧输入源与目标最长边。 |
| getFramesInterval(long intervalUs, FrameExtractingCallback callback) | 按时间间隔批量抽帧。 |
| getFrames(List<Long> ptsList, float granularity, FrameExtractingCallback callback) | 按指定时间点队列批量抽帧。 |
| getFrameAtTime(long pts, float granularity, FrameExtractingCallback callback) | 获取指定时间点的帧。 |
| getCacheFrame(String path, long pts, int longSide, float granularity) | 读内存/磁盘缓存中的抽帧结果。 |
| saveCacheFrame(String path, Bitmap bmp, long pts, int longSide, float granularity) | 将抽帧结果写入缓存。 |
| getDuration() | 输入源时长。 |
| requestStop() | 停止当前抽帧任务。 |
| release() | 释放抽帧器资源。 |
注意:说明:
注意:原始帧抽帧统一使用 getFrameAtTime(pts, granularity, FrameExtractingCallback),结果通过 onExtractedFrame(String, Bitmap, long) 回调。