相关文章推荐
帅气的闹钟  ·  Java获取的一天、本星期、这个月、本季度、 ...·  8 月前    · 
想发财的火腿肠  ·  jquery项目怎么运行 - CSDN文库·  9 月前    · 
豪爽的麦片  ·  如何让Spring的OncePerReque ...·  1 年前    · 
含蓄的钢笔  ·  PNPM 安装使用_pnpm 下载-CSDN博客·  1 年前    · 
不拘小节的香蕉  ·  利用dompdf漏洞从XSS到RCE - 知乎·  1 年前    · 
Code  ›  Android FFmpeg系列09--抽帧与快速抽帧开发者社区
include ffmpeg
https://cloud.tencent.com/developer/article/2168938
无邪的铁板烧
10 月前
雪月清

Android FFmpeg系列09--抽帧与快速抽帧

前往小程序,Get 更优 阅读体验!
立即前往
腾讯云
开发者社区
文档 建议反馈 控制台
首页
学习
活动
专区
工具
TVP
最新优惠活动
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
雪月清
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
社区首页 > 专栏 > Android FFmpeg系列09--抽帧与快速抽帧

Android FFmpeg系列09--抽帧与快速抽帧

作者头像
雪月清
发布 于 2022-11-19 09:57:09
1.6K 0
发布 于 2022-11-19 09:57:09
举报
文章被收录于专栏: 雪月清的随笔

视频抽帧的实现方式是 seek+解码 的结合,在剪辑软件和播放器中都存在不少应用场景,比如剪辑软件导入视频后展示的封面图、视频时间轴等

(剪映导入演示视频oceans.mp4)

本篇文章基于之前的Demo工程实现一个抽帧的utils并仿照系统相册展示一个视频缩略图轨道

(系统相册导入演示视频oceans.mp4)

抽帧实现

FFMpegUtils.kt

对外工具类

代码语言: javascript
复制
object FFMpegUtils {
    interface VideoFrameArrivedInterface {
         * @param duration
         * 给定视频时长,返回待抽帧的pts arr,单位为s
        fun onFetchStart(duration: Double): DoubleArray
         * 每抽帧一次回调一次
        fun onProgress(frame: ByteBuffer, timestamps: Double, width: Int, height: Int, index: Int): Boolean
         * 抽帧动作结束
        fun onFetchEnd()
    fun getVideoFrames(path: String,
                       width: Int,
                       height: Int,
                       cb: VideoFrameArrivedInterface) {
        getVideoFramesCore(path, width, height, cb)
    private external fun getVideoFramesCore(path: String,
                                            width: Int,
                                            height: Int,
                                            cb: VideoFrameArrivedInterface)
}

FFReader.h

封装一个Reader基类,用于读取音频、视频avpacket

代码语言: javascript
复制
#ifndef FFMPEGDEMO_FFREADER_H
#define FFMPEGDEMO_FFREADER_H
#include <string>
extern "C" {
#include "libavformat/avformat.h"
#include "libavcodec/avcodec.h"
#include "libswscale/swscale.h"
#include "libavutil/imgutils.h"
enum TrackType {
    Track_Video,
    Track_Audio
 * read AVPacket class
class FFReader {
public:
    FFReader();
    virtual ~FFReader();
    bool init(std::string &path);
    bool selectTrack(TrackType type);
    int fetchAvPacket(AVPacket *pkt);
    bool isKeyFrame(AVPacket *pkt);
     * 获取timestamp对应的关键帧index,基于BACKWARD
     * @param timestamp: 时间单位s
     * @return
    int getKeyFrameIndex(int64_t timestamp);
    double getDuration();
     * seek
     * @param timestamp: 时间单位s
    void seek(int64_t timestamp);
    void flush();
    void release();
private:
    // ....略
#endif //FFMPEGDEMO_FFREADER_H

FFVideoReader.h

继承自FFReader,负责解码视频帧、resize、格式转化(通过libyuv统一输出RGBA数据)等

代码语言: javascript
复制
#ifndef FFMPEGDEMO_FFVIDEOREADER_H
#define FFMPEGDEMO_FFVIDEOREADER_H
#include "FFReader.h"
class FFVideoReader: public FFReader{
public:
    FFVideoReader(std::string &path);
    ~FFVideoReader();
    void getFrame(int64_t pts, int width, int height, uint8_t *buffer);
private:
    // ...略
 
推荐文章
帅气的闹钟  ·  Java获取的一天、本星期、这个月、本季度、一年等 开始和结束时间-腾讯云开发者社区-腾讯云
8 月前
想发财的火腿肠  ·  jquery项目怎么运行 - CSDN文库
9 月前
豪爽的麦片  ·  如何让Spring的OncePerRequestFilter在抛出异常时返回除401之外的状态码?
1 年前
含蓄的钢笔  ·  PNPM 安装使用_pnpm 下载-CSDN博客
1 年前
不拘小节的香蕉  ·  利用dompdf漏洞从XSS到RCE - 知乎
1 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号