关于Android seekTo的一点记录

本文探讨了一款APP中音视频处理的技术难点,特别是在不同平台(iOS与Android)上使用seekto方法进行精准定位的问题。文章提出了两种解决方案:一是通过调整视频文件中的关键帧密度来改善定位精度;二是利用Android API 26中新增的seekto方法参数mode来优化。这些方案虽然各有优劣,但仍为跨平台音视频同步提供了有价值的参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里写图片描述
最近在做一个app,里边有音视频处理的业务。包括从视频中抽取音频、对音频进行切割、替换、合并,最终将音频合成到视频中等等。

以上功能均实现。但在播放时却出了一个问题,就是使用seekto方法去按照每一句对话(比如音乐中的每一句歌词)进行精准定位。同样一个视频,在IOS基本ok,但在Android中却不能达到效果。

一直在查找解决方案,了解到了关键帧的问题,初步是从视频源去解决,将关键帧加的密集或者按照每句话开始结束时间进行关键帧(key frame)添加。

如果将关键帧加的密集带来的问题是视频容量成倍增大,显然不行,需要找一个合适的密集度进行添加关键帧。加入1秒有20帧的话,50毫秒是一帧,可以让2–6帧加一个关键帧,密集度越大,空间占用越小。这是一个暂时的方案去进行。

我也在官网查询方法,无意间看到最新的api26中对seekto方法新增了参数mode,看起来是一种模式,我准备下载最新的模拟器进行尝试,之后有好的结果,会写到这里,这算是第二种方案,但不能应用于线上,因为这个版本的手机目前凤毛麟角。做为以后优化的方案吧。但Google也在这方面加入了大量的处理,赞赞赞!(((o(゚▽゚)o)))

2017年11月7日 20:27:49

–以下来自网络—————-



Platform Version -| API Level|  VERSION_CODE|   中文名称
Android API 26  |     26
Android 7.1.1/7.1     25             Nougat
Android 7.0           24         Nougat          牛轧糖
Android 6.0           23    Marshmallow          棉花糖
Android 5.1           22           Lollipop
Android 5.0/L         21          Lollipop       棒棒糖
Android 4.4W          20
Android 4.4           19         KITKAT         奇巧巧克力
Android 4.3           18       JELLY_BEAN_MR2
Android 4.2, 4.2.2    17       JELLY_BEAN_MR1
Android 4.1, 4.1.1    16        JELLY_BEAN        豆豆糖
Android 4.0.3, 4.0.4    15  ICE_CREAM_SANDWICH_MR1
Android 4.0, 4.0.1, 4.0.2   14  ICE_CREAM_SANDWICH  冰激凌三明治
Android 3.2           13        HONEYCOMB_MR2
Android 3.1.x         12        HONEYCOMB_MR1
Android 3.0.x         11        HONEYCOMB         蜂巢
Android 2.3.4         10        GINGERBREAD_MR1
Android 2.3.3
Android 2.3.2         9         GINGERBREAD     姜饼
Android 2.3.1
Android 2.3
Android 2.2.x         8          FROYO       冻酸奶
Android 2.1.x         7 ECLAIR_MR1
Android 2.0.1         6 ECLAIR_0_1
Android 2.0           5    ECLAIR        松饼
Android 1.6           4 DONUT            甜甜圈
Android 1.5           3 CUPCAKE           纸杯蛋糕
Android 1.1            2    BASE_1_1
Android 1.0           1 BASE
您好!为了实现精确定位到指定帧的功能,您可以使用以下步骤: 1. 创建一个 MediaExtractor 对象,并设置要解析的媒体文件路径: ```java MediaExtractor extractor = new MediaExtractor(); extractor.setDataSource(filePath); ``` 2. 选择要解析的媒体轨道,例如音频轨道或视频轨道: ```java int trackIndex = selectTrack(extractor, mediaType); // mediaType可以是"audio"或"video" extractor.selectTrack(trackIndex); ``` 3. 使用 `seekTo()` 方法定位到指定时间或帧数。对于精确定位到指定帧,您需要知道帧的时间戳,并将其转换为微秒(以微秒为单位的时间戳): ```java long targetTimeUs = frameTimestamp * 1000; // 将帧的时间戳转换为微秒 extractor.seekTo(targetTimeUs, MediaExtractor.SEEK_TO_CLOSEST_SYNC); ``` 或者,如果您知道要跳转到的帧索引,可以使用如下方法: ```java extractor.seekTo(frameIndex, MediaExtractor.SEEK_TO_PREVIOUS_SYNC); ``` 请注意,`frameIndex` 是帧的索引,从0开始计数。 4. 迭代解析从 seekTo() 定位的帧直到您满足的条件为止。例如,如果您想解析一帧视频,则可以使用以下代码: ```java MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo(); boolean foundFrame = false; while (!foundFrame) { int inputBufferIndex = decoder.dequeueInputBuffer(timeoutUs); if (inputBufferIndex >= 0) { // 将输入数据填充到解码器输入缓冲区 // ... // 解码缓冲区的输出数据 // ... // 检查输出数据是否是您要寻找的帧 // 如果是,则将 foundFrame 设置为 true } } ``` 注意:以上代码只是示意,实际实现可能会有所不同。您需要根据您的需求和媒体类型进行适当的调整。 希望这些信息能对您有所帮助!如果您有任何进一步的问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值