首页
学习
活动
专区
工具
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)属于硬编硬解技术、因为硬件中内置了编解码芯片。

77720

【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.2K10

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

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

    1.4K10

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

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

    2.5K00

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

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

    2.1K20

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

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

    9.7K11

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

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

    2.5K30

    鸿蒙NEXT版仿抖音快手App的获取视频缩略图

    上一节我们利用系统相机实现了录像功能,那么为了直观地浏览视频列表,就要给每个视频配上封面,这个封面图的来源之一便是视频里的某帧画面。...接下来就介绍如何从视频文件中根据时间点提取帧图像,具体的提取过程分为以下四个步骤。...}); 4、根据时间点从视频文件获取帧图像 调用图像生成器的fetchFrameByTime方法,即可根据时间点从视频文件获取帧图像,注意在此之前得先给生成器的fdSrc字段赋值,传入视频文件的文件句柄和文件大小等信息...fetchFrameByTime方法的前三个参数包含了待截取的图像帧规格,其中第一个参数为该帧所处的时间点,单位微秒;第二个参数指定了要返回哪种关键帧;第三个参数指定了图像按什么尺寸返回。...// AV_IMAGE_QUERY_NEXT_SYNC表示取时间点之后的关键帧,AV_IMAGE_QUERY_PREVIOUS_SYNC表示取时间点之前的关键帧 let queryOption = media.AVImageQueryOptions.AV_IMAGE_QUERY_NEXT_SYNC

    14010

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

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

    1.3K00

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

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

    1.5K61

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

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

    98331

    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.6K10

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

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

    1.7K10

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

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

    8K140

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

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

    21610

    【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.3K20

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

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

    1.1K10

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

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

    21410

    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
    领券