首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何获取Android中视频文件的关键帧(同步帧)时间戳列表?

获取Android中视频文件的关键帧(同步帧)时间戳列表,可以通过以下步骤实现:

  1. 导入所需库:
代码语言:java
复制
import android.media.MediaExtractor;
import android.media.MediaFormat;
  1. 创建一个方法来获取关键帧时间戳列表:
代码语言:java
复制
public List<Long> getKeyFrameTimeStamps(String videoPath) {
    List<Long> keyFrameTimeStamps = new ArrayList<>();
    MediaExtractor mediaExtractor = new MediaExtractor();
    try {
        mediaExtractor.setDataSource(videoPath);
        int numTracks = mediaExtractor.getTrackCount();
        for (int i = 0; i < numTracks; i++) {
            MediaFormat format = mediaExtractor.getTrackFormat(i);
            String mime = format.getString(MediaFormat.KEY_MIME);
            if (mime.startsWith("video/")) {
                mediaExtractor.selectTrack(i);
                int frameIndex = 0;
                while (true) {
                    MediaCodec.BufferInfo info = new MediaCodec.BufferInfo();
                    ByteBuffer buffer = mediaExtractor.getSampleBuffer(frameIndex);
                    if (buffer == null) {
                        break;
                    }
                    mediaExtractor.getSampleTrackIndex();
                    mediaExtractor.getSampleTime();
                    mediaExtractor.getSampleFlags();
                    if ((info.flags & MediaCodec.BUFFER_FLAG_KEY_FRAME) != 0) {
                        keyFrameTimeStamps.add(info.presentationTimeUs);
                    }
                    frameIndex++;
                }
                break;
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        mediaExtractor.release();
    }
    return keyFrameTimeStamps;
}
  1. 调用该方法并传入视频文件路径:
代码语言:java
复制
String videoPath = "/path/to/video/file.mp4";
List<Long> keyFrameTimeStamps = getKeyFrameTimeStamps(videoPath);
  1. 处理关键帧时间戳列表:
代码语言:java
复制
for (Long timeStamp : keyFrameTimeStamps) {
    // 处理每个关键帧时间戳
}

通过以上步骤,您可以获取Android中视频文件的关键帧(同步帧)时间戳列表。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

FFmpeg入门 - 前置基础

2,I,B,P I 关键帧采用帧内压缩技术,I是全信息、一个视频文件当中I越多,则文件体积越大。 B B 是前后参考,它属由间压缩技术。...P P是向前参考,也就是它参考是前一个关键帧数据。P也属于间压缩技术,相对于 B来说,P压缩率要比B低。...3,pts&dts pts(演示文稿时间) 视频渲染用时pts、即以AVStream AVRational (time_base)为计时单位时间,加入 pts 时100 ,AVStream...dts(解码时间) 视频packet 解码为 frame 时时间。之所以需要dts 是因为 视频除了I 还有可能含有 B。...视频编解码 - 移动终端 如iOS、Android移动端经常用到音视频编解码sdk ijkplayer,是对ffplay.c二次封装(ffmpeg)属于硬编硬解技术、因为硬件内置了编解码芯片。

77020
  • Android 音视频开发打怪升级:音视频硬解码篇】三、音视频播放:音视频同步

    在上一篇文章定义解码流程框架基类,预留了几个虚函数,留给子类初始化自己东西,本篇,就来看看如何实现。...4)进入下一:先记录当前时间,然后调用advance进入下一,这时读取指针将自动移动到下一开头。 //记录当前时间 mCurSampleTime = mExtractor!!....,因此需要指定seek靠近哪个关键帧,有以下三种类型: SEEK_TO_PREVIOUS_SYNC:跳播位置上一个关键帧 SEEK_TO_NEXT_SYNC:跳播位置下一个关键帧 SEEK_TO_CLOSEST_SYNC...:距离跳播位置最近关键帧 到这里你就可以明白,为什么我们平时在看视频时,拖动进度条释放以后,视频通常会在你释放位置往前一点 封装音频和视频提取器 上面封装工具,可以支持音频和视频数据提取...这样可以用来实现同步时间源就有三个: 视频时间 音频时间 外部时间 视频PTS 通常情况下,由于人类对声音比较敏感,并且视频解码PTS通常不是连续,而音频PTS是比较连续,如果以视频为同步信号源的话

    2.4K20

    什么是视频关键帧?流媒体服务器如何提取视频关键帧

    我上一篇文章写了关于视频直播点播服务器调整关键帧间隔方法,同时也发现也是有一部分开发者是有这个需求。...,就变成关键帧了;普通是用来计量播放时间或过渡时间,不能手动设置普通内容,它是播放过程由前后关键帧以及过渡类型自动填充,手动插入或删除普通,会改变前后两个关键帧之间过渡时间。...其实提取关键帧比提取视频快很多倍,下面我就基于Android系统来讲一下提取视频方法: 第一个参数 是传入截取时间,只能是us(微秒) 第二个参数 OPTION_CLOSEST 在给定时间,检索最近一个...OPTION_CLOSEST_SYNC 在给定时间,检索最近一个同步与数据源相关联关键帧)。 OPTION_NEXT_SYNC 在给定时间之后检索一个同步与数据源相关联关键帧。...); } /** * 获取视频文件截图 * * @param path 视频文件路径 * @return Bitmap 返回获取Bitmap

    4.1K10

    Android平台播放RTSP流几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

    ​技术背景好多开发者需要遴选Android平台RTSP直播播放器时候,不知道如何好,本文针对常用方案,做个大概说明:1....以下是一个详细集成流程:1. 获取VLC源代码从VLC官方Git仓库获取源代码。...OpenSL ES; [实时静音]支持播放过程,实时静音/取消静音; [实时音量调节]支持播放过程实时调节音量; [实时快照]支持播放过程截取当前播放画面; [只播关键帧]Windows平台支持实时设置是否只播放关键帧...音视频同步处理: 大多播放器为了追求低延迟,甚至不做音视频同步,拿到audio video直接播放,导致a/v不同步,还有就是时间乱跳等各种问题,大牛直播SDK提供播放器,具备好时间同步和异常时间矫正机制...只播放关键帧: 特别是大屏多实例场景播放时候,尽管我们已经CPU占用非常低了,如果只是查看大概监控情景,实现更多路播放,只播放关键帧是个非常好功能点,如果需要原始播放,可以实时调节即可;17.

    41310

    使用MediaCodeC将图片集编码为视频

    对音视频领域知识感兴趣朋友,欢迎一起来学习!!! 提要 这是MediaCodeC系列第三章,主题是如何使用MediaCodeC将图片集编码为视频文件。...在一般情况下,填充和取出两个动作并不是即时,也就是说并不是压入一数据,就能拿出一数据。当然,除了编码视频每一都是关键帧情况下。...MediaCodeC硬解码视频,并将视频存储为图片文件视频文件解码出来,332张图片。...fun drainFrame(b: Bitmap, presentTime: Long) { encodeProgram.renderBitmap(b) // 给渲染这一设置一个时间...之后,使用EGLswapBuffer提交当前渲染结果,在提交之前,使用setPresentationTime提交当前代表时间。 更加具体代码实现,都在我Github项目中。

    2.4K00

    Android短视频开发,我们该如何快速实现移动端短视频功能?

    三.录制视频方式 在Android系统当中,如果需要一台Android设备来获取到一个MP4这样视频文件的话,主流方式一共与三种:MediaRecorder、MediaCodec+MediaMuxer...MediaCodec是Android提供编解码类,MediaMuxer则是复用类(生成视频文件)。...帧数:每秒显示多少个画面,fps 关键帧间隔:在H.264编码,编码后输出压缩图像数据有多种,可以简单分为关键帧和非关键帧关键帧能够进行独立解码,看成是一个图像经过压缩产物。...而非关键帧包含了与其他“差异”信息,也可以称呼为“参考”,它解码需要参考关键帧才能够解码出一个图像。非关键帧拥有更高压缩率。...注意音视频通过PTS(Presentation time stamp,决定了某一音视频数据何时显示或播放)来同步,音频time stamp需在AudioRecord从MIC采集到数据时获取并放到相应

    2.1K20

    Android FFMPEG 开发】FFMPEG 视频播放进度控制 ( 显示播放进度 | 拖动进度条播放 )

    主要问题 : 那么问题就集中在了 如何获取当前播放时间 , 当前播放时间可以从 AVFrame 音视频获取 ; 3 ....获取当前播放时间流程 : ① 获取 AVFrame 结构体 : 这是解码后音视频数据 , 从音视频流读取出来是 AVPacket 数据包 , 使用编解码器将 AVPacket 压缩数据包 解码成...AVFrame 实际数据 , 其中 音频 / 视频 是解码后 采样 或 图像 数据 , 可以用于直接播放 ; ② 从 AVFrame 获取当前相对播放时间 : AVFrame 结构体中封装...; //将秒单位 转为 微秒单位 int64_t seek = progress * 1000 * 1000; // 跳转核心方法 , 跳转到距离时间最近关键帧位置 av_seek_frame(..._t timestamp 参数 : 要跳转目的时间 , 之后要在该时间附近查找关键帧 ; ④ int flags 参数 : 设置跳转模式 ; ⑤ int 返回值 : 返回值大于等于 0 , 代表打开成功

    2.2K20

    音视频生产关键指标:视频编辑优化丨音视频工业实战

    所以,应对不同视频,抽具体处理方式也不同。 精准抽:要按照给定时间列表,抽取并返回对应时间图像。 采用跳跃方式进行解码。...首先计算待解码各时间位于哪个 GOP,从对应 GOP IDR 开始解码,直到解码到准确位置。...1.4、解码丢弃非参考 非参考就是其他在解码过程不需要参考此。在解码目标时,可以丢弃掉关键帧和目标之间非参考不进行解码,从而节省解码时间,提升抽速度。...1.5、解码性能测试和适配 不同设备软解、硬解性能有较大差异,在 Android 设备上硬解还包括 ByteBuffer 和 Surface 方式,它们解码性能也表现不同,解码方式有同步也有异步...1.8、多线程并发 可将多个抽目标时间划分到多个 GOP,由于 GOP 是可以独立解码单元,所以可以对这些 GOP 进行并发解码抽,每组用一个解码器解码,这样可以时限并行解码。

    94531

    融云技术分享:基于WebRTC实时音视频首显示时间优化实践

    从而会触发观看端关键帧请求给服务器。 这里要求服务器必须转发接收端发来关键帧请求给发送端。若服务器没有转发关键帧给发送端,接收端就会长时间没有可以渲染图像,从而出现黑屏问题。...如果因此持续丢弃 packet,就会有视频不显示或卡顿情况。 举例2: 正常情况下 FrameBuffer picture id,时间都是一直正增长。...如果 FrameBuffer 收到 picture_id 比最后解码 picture id 小时,分两种情况: 1)时间比最后解码时间大,且是关键帧,就会保存下来。...另外列举了 Android 解码器对视频宽高要求、服务端对关键帧请求处理、以及 WebRTC 代码内部一些丢帧逻辑等多个方面对视频显示影响。...这些点都提高了融云 SDK 视频首显示时间,改善了用户体验。 因个人水平有限,文章内容或许存在一定局限性,欢迎回复进行讨论。 本文已同步发布于“即时通讯技术圈”公众号。

    1.2K00

    刷抖音上瘾后,决定探究如果做一款类似抖音短视频app

    三、录制视频方式 在Android系统当中,如果需要一台Android设备来获取到一个MP4这样视频文件的话,主流方式一共与三种:MediaRecorder、MediaCodec+MediaMuxer...MediaCodec是Android提供编解码类,MediaMuxer则是复用类(生成视频文件)。...帧数:每秒显示多少个画面,fps 关键帧间隔:在H.264编码,编码后输出压缩图像数据有多种,可以简单分为关键帧和非关键帧关键帧能够进行独立解码,看成是一个图像经过压缩产物。...而非关键帧包含了与其他“差异”信息,也可以称呼为“参考”,它解码需要参考关键帧才能够解码出一个图像。非关键帧拥有更高压缩率。...注意音视频通过PTS(Presentation time stamp,决定了某一音视频数据何时显示或播放)来同步,音频time stamp需在AudioRecord从MIC采集到数据时获取并放到相应

    2.4K30

    融云 WebRTC 首显示优化策略到底有多强?

    从而会触发观看端关键帧请求给服务器。这里要求服务器必须转发接收端发来关键帧请求给发送端。若服务器没有转发关键帧给发送端,接收端就会长时间没有可以渲染图像,从而出现黑屏问题。...如果因此持续丢弃 packet,就会有视频不显示或卡顿情况。 举例2 正常情况下 FrameBuffer picture id,时间都是一直正增长。...如果 FrameBuffer 收到 picture_id 比最后解码 picture id 小时,分两种情况: 1. 时间比最后解码时间大,且是关键帧,就会保存下来; 2...."; return last_continuous_picture_id; } } 因此为了能让收到了流顺利播放,发送端和中转服务端需要确保视频 picture_id, 时间正确性...另外列举了 Android 解码器对视频宽高要求、服务端对关键帧请求处理、以及 WebRTC 代码内部一些丢帧逻辑等多个方面对视频显示影响。

    1.5K61

    MP4文件格式解析,以及MP4文件分割算法

    一般来说,解析媒体文件,最关心部分是视频文件宽高、时长、码率、编码格式、列表关键帧列表,以及所对应和在文件位置,这些信息,在mp4,是以特定算法分开存放在stbl box下属几个...看吧,要获取到mp4文件列表,还挺不容易,需要一层层解析,然后综合stts stsc stsz stss stco等这几个box信息,才能还原出列表,每一和偏移量。...读出stsc之后,就可以综合stbl下所有box,推算出视频和音频列表,时和偏移量等数据。下面截图展示获取关键帧列表: ?   ...二、MP4文件分割算法   所谓“分割”,就是把大文件切成小文件,要实现mp4分割,   首先,需要获取关键帧列表   然后,选择要分割时间段(比如从关键帧开始)   接着,重新生成moov box...(注意所有相关box 以及 box size都需要改变)   最后,拷贝对应数据,生成新文件   第一点,上面已经介绍了,第二点,只需要遍历关键帧列表,就能找到离你想要分割时间段最接近关键帧,第四点就是

    7.9K140

    WinCC 如何获取在线 表格控件数据最大值 最小值和时间

    1 1.1 <读取 WinCC 在线表格控件特定数据列最大值、最小值和时间,并在外部对 象显示。如图 1 所示。...左侧在线表格控件显示项目中归档变量值,右侧静态 文本显示是表格控件温度最大值、最小值和相应时间。 1.2 <使用软件版本为:WinCC V7.5 SP1。...6.在画面配置文本域和输入输出域 用于显示表格控件查询开始时间和结束时 间,并组态按钮。用于执行数据统计和数据读取操作。如图 7 所示。...按钮“单击鼠标”动作下创建 VBS 动作,编写脚本用于执行统计和数据读取操作。其中“执行统计”按钮下脚本如图 8 所示。用于获取统计数据并在 RulerControl件显示。...项目激活后,设置查询时间范围。如图 10 所示。 2. 点击 “执行统计” 获取统计结果。如图 11 所示。 3.最后点击 “读取数据” 按钮,获取最大值、最小值和时间

    9.3K11

    融云技术分享:基于WebRTC实时音视频首显示时间优化实践

    从而会触发观看端关键帧请求给服务器。 这里要求服务器必须转发接收端发来关键帧请求给发送端。若服务器没有转发关键帧给发送端,接收端就会长时间没有可以渲染图像,从而出现黑屏问题。...如果因此持续丢弃 packet,就会有视频不显示或卡顿情况。 举例2: 正常情况下 FrameBuffer picture id,时间都是一直正增长。...如果 FrameBuffer 收到 picture_id 比最后解码 picture id 小时,分两种情况: 1)时间比最后解码时间大,且是关键帧,就会保存下来。...时间正确性。...另外列举了 Android 解码器对视频宽高要求、服务端对关键帧请求处理、以及 WebRTC 代码内部一些丢帧逻辑等多个方面对视频显示影响。

    1.7K10

    短视频源码开发,Android端短视频功能快速实现

    三、录制视频方式 在Android系统当中,如果需要一台Android设备来获取到一个MP4这样视频文件的话,主流方式一共与三种:MediaRecorder、MediaCodec+MediaMuxer...MediaCodec是Android提供编解码类,MediaMuxer则是复用类(生成视频文件)。...帧数:每秒显示多少个画面,fps 关键帧间隔:在H.264编码,编码后输出压缩图像数据有多种,可以简单分为关键帧和非关键帧关键帧能够进行独立解码,看成是一个图像经过压缩产物。...而非关键帧包含了与其他“差异”信息,也可以称呼为“参考”,它解码需要参考关键帧才能够解码出一个图像。非关键帧拥有更高压缩率。...注意音视频通过PTS(Presentation time stamp,决定了某一音视频数据何时显示或播放)来同步,音频time stamp需在AudioRecord从MIC采集到数据时获取并放到相应

    1.1K10

    HLS直播协议详解

    -hls_list_size 0: 设置.m3u8文件包含分段列表大小为0,表示将所有分段都包含在.m3u8文件,而不生成分段列表文件。...-r 30: 设置输出视频帧率为30/秒。 -g 60: 设置关键帧(I)之间间隔为60关键帧是视频编码重要,可以独立解码,而其他则依赖于关键帧进行解码。...EXT-X-PROGRAM-DATE-TIME:和 Media Segment 第一个 sample 一起来确定时间。...3、播放模式 点播 VOD 特点就是当前时间点可以获取到所有 index 文件和 ts 文件,二级 index 文件记录了所有 ts 文件地址。这种模式允许客户端访问全部内容。...pes 层 pes 层是在每一个视频/音频上加入了时间等信息,pes 包内容很多,我们只留下最常用。 es 层 es 层指就是音视频数据, 我们只介绍 h.264 视频。

    1.4K10

    深入理解MP4视频文件裁剪原理

    上接《深入理解MP4视频文件裁剪原理[上]》 3.17 stts box*   stts box里面保存了一个压缩格式表,用来描述音视频解码时间。...所以当裁剪时候,因为用户指定目标MP4时间范围,所以,需要在展开后时间序列来匹配目标时间范围进行截取。...为了让播放时候能够不产生花屏现象,一般要求首是IDR,所以,对于用户指定目标时间范围起始时间,我们需要先找到离起始时间最近关键帧,得到该关键帧序号,然后再直接跳过关键帧之前,...关于如何找到最接近关键帧,需要查找stss box关键帧记录表,请参考3.18节内容描述。...3.18 stss box*   stss box里面保存了一个关键帧序号列表,以便播放器可以快速按照关键帧进行seek操作。

    16810

    FFMPEG Tips (3) 如何读取

    码流每一哪些信息值得关注 ? [1 ]  音频还是视频 [2 ]  关键帧还是非关键帧 [3 ]  数据和大小 [4 ]  时间信息 2.  为什么要关注这些信息 ?...[1 ]  音频还是视频 -> 分别送入音频/视频××× [2 ]  关键帧还是非关键帧 -> 追优化 [3 ]  数据和大小 -> 取出内容 [4 ]  时间信息 -> 音视频同步 3...判断是否为关键帧方法也比较简单,示例如下: if (avpkt.flags & AV_PKT_FLAG_KEY) {     LOGD("read a key frame"); } 3.3 如何获取数据和大小...数据和大小直接定义在 AVPacket 结构体,对应成员变量如下: // 压缩编码数据,一音频/视频 uint8_t *data; // 数据大小 int size; 3.4 如何获取时间信息...,比如是否出现了时间回滚和错乱,则必然会导致播放端出现音视频不同步或者显示异常等情况。

    1.2K10

    Android经典面试题之Java获取时间方式有哪些?有什么区别?

    在Java,有多种获取时间方法,每种方法都有其特定用途和特点。以下是常见一些方法及其详细解释: 1. System.currentTimeMillis() 描述:返回当前时间毫秒数。...Instant.now().toEpochMilli() 描述:java.time包Instant类提供了以毫秒数形式获取当前时间方法。...Instant.now().getEpochSecond() 描述:Instant类提供另一个方法,可以获取以秒为单位的当前时间。 用途:适用于秒级别的时间操作,比毫秒级别的时间更简洁。...用途:常用于与数据库操作相关时间操作。...System.nanoTime()基于一个任意但固定时间点。 根据具体需求和应用场景,选择合适获取时间方法对于代码效率和准确性都很重要。

    14910
    领券