草庐IT

android - MediaPlayer.seekTo(int ms) 的精度

coder 2023-06-07 原文

为什么 MediaPlayer.seekTo(int msec) 如此不准确?

有时会提前 30 秒(对于可变比特率和恒定比特率的 mp3)!寻找音频本身是有问题的还是这种方法被破坏了?是缓冲还是什么?

我还注意到总运行时 getDuration() 可能是错误的(这不是大问题),我已经测试了 getCurrentPosition()足够准确(因为每播放 n 秒,它就会增加 n 千)。我使用的是 Android 2.2。

最后,有没有人知道它实际上始终适用于哪些格式(最好是 wav 以外的格式)?

编辑:

我主要听播客。 smodcast 和 Thinking Allowed 多次出现问题,即使在转换/重新编码为 CBR 之后也是如此。文件没有损坏。

QuickMediaConverter (Windows) 似乎工作正常,但 Sound Converter (Ubuntu) 生成了一些不可靠的文件。我会尽量坚持前者...

更新:QuickMediaConverter 工作得非常好,但不知道为什么。从此没有问题!

最佳答案

多媒体框架可以通过两种方式对多媒体 (AV) 文件执行查找操作。

  1. 寻找关键帧 - 编码后的视频通常会有称为 I 帧或关键帧的东西,这意味着该帧包含大量信息,可用于完整解码一帧。为了减少空间量,所有帧都没有被编码为关键帧,而是被编码为 P(预测)帧或预测帧,这意味着您可以在关键帧的帮助下解码 P 帧。

    所以在查找操作期间,在这种情况下,查找是在给定的持续时间内对最近的关键帧进行的。例如,如果用户搜索到 40 秒,而最近的关键帧在第 35 秒,则搜索将在第 35 秒而不是第 40 秒完成。

  2. 寻找时间 - 这是寻找用户要求的准确时间。

    仍然在最近的关键帧处进行搜索,否则您会看到视频的绿色斑 block 或像素化,这是非常不受欢迎的。因此,取而代之的是对关键帧进行搜索,然后对帧进行解码,直到所需的时间,但是这些帧被丢弃并且不向用户显示。在上面的例子中,从第 35 秒到第 40 秒的所有解码帧都被丢弃,只有超过 40 秒的帧才会显示给用户。

如果是纯音频文件,可能有两种情况(如果没有解析器或解析器不构建时间戳表,则 -)

  1. CBR - 恒定比特率 - 由于比特率是恒定的,我们可以在给定时间跳过必要数量的字节(比特率 * timeToSeek = 要跳过的字节)

  2. VBR - 可变比特率 - 比特率不是恒定的,它会不断变化。所以在这种情况下求出文件的平均码率再用上面的方法,这种情况下查找是不准确的。

现在回到您的问题,我可以自信地说它运行良好,并且对于大多数媒体文件都是准确的。

您可能会遇到此类问题的唯一原因是媒体文件本身已损坏。 (在搜索过程中不可能有 30 秒的差异 + 你说的持续时间没有正确返回。Android 2.2 的媒体播放器 API 都没有损坏)

关于 Android 支持哪些格式,请参阅 link

那么您可以尝试使用另一个 mp3 文件吗?

关于android - MediaPlayer.seekTo(int ms) 的精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6845161/

有关android - MediaPlayer.seekTo(int ms) 的精度的更多相关文章

  1. [工业相机] 分辨率、精度和公差之间的关系 - 2

    📢博客主页:https://blog.csdn.net/weixin_43197380📢欢迎点赞👍收藏⭐留言📝如有错误敬请指正!📢本文由Loewen丶原创,首发于CSDN,转载注明出处🙉📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨文章预览:一.分辨率(Resolution)1、工业相机的分辨率是如何定义的?2、工业相机的分辨率是如何选择的?二.精度(Accuracy)1、像素精度(PixelAccuracy)2、定位精度和重复定位精度(RepeatPrecision)三.公差(Tolerance)四.课后作业(Post-ClassExercises)视觉行业的初学者,甚至是做了1~2年

  2. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  3. ruby-on-rails - ruby on rails 模型验证中的浮点精度 - 2

    我正在尝试使用正则表达式验证美元金额:^[0-9]+\.[0-9]{2}$这工作正常,但每当用户提交表单并且美元金额以0(零)结尾时,ruby(或rails?)将0砍掉。所以500.00变成500.0,因此正则表达式验证失败。有没有办法让ruby​​/rails保持用户输入的格式,而不管尾随零? 最佳答案 我假设您的美元金额是小数类型。因此,用户在字段中输入的任何值在保存到数据库之前都会从字符串转换为适当的类型。验证适用于已转换为数字类型的值,因此在您的情况下,正则表达式并不是真正合适的验证过滤器。不过,您有几种可能性可以解决这个问

  4. ruby - Ruby 的任意精度算术 - 2

    Ruby到底是怎么做到的?Jörg或其他人是否知道幕后发生的事情?不幸的是,我不太了解C,所以bignum.c对我帮助不大。我只是有点好奇有人可以解释(用简单的英语)它使用的任何神奇算法背后的理论。irb(main):001:0>999**99936806348825922326789470084006052186583833823203735320465595962143702560930047223153010387361450517521869134525758989639113039318944796977164583238219236607653663113200177617

  5. ruby-on-rails - Rails 2.3.11 DateTime BigDecimal 精度 - 2

    我目前有一个运行Ruby1.8.7和Rails2.3.2的RubyonRails项目我有一些从数据库中读取数据的单元测试,特别是两个连续项目的日期时间列,这两个项目应该相隔24小时。在一项测试中,我将项目2的日期时间设置为与项目1的日期时间相同。当我执行断言以确保两个值相等时,测试在rails2.3.2下工作正常。当我升级到rails2.3.11时,测试失败显示两次之间的差异将关闭并出现以下错误:expectedbutwas.这两个版本的rails中似乎存在浮点转换问题。如何解决float问题? 最佳答案 这也发生在我身上,我最终这

  6. ruby-on-rails - Ruby float 学 - Sum Calc 中的精度问题 - 2

    大家早上好我在float学方面遇到了一些问题,完全迷失在“.to_f”、“*100”和“.0”中!我希望有人能帮助我解决我的具体问题,并准确解释他们的解决方案为何有效,以便我下次理解这一点。我的程序需要做两件事:对一组小数求和,确定它们的和是否正好为1.0确定1.0与数字总和之间的差值-将变量的值设置为使总和等于1.0的精确差值。例如:[0.28,0.55,0.17]->总和应为1.0,但我一直得到1.xxxxxx。我正在以下列方式实现总和:sum=array.inject(0.0){|sum,x|sum+(x*100)}/100我需要此功能的原因是我正在读取一组来自excel的小数。

  7. Android Studio开发之使用内容组件Content获取通讯信息讲解及实战(附源码 包括添加手机联系人和发短信) - 2

    运行有问题或需要源码请点赞关注收藏后评论区留言一、利用ContentResolver读写联系人在实际开发中,普通App很少会开放数据接口给其他应用访问。内容组件能够派上用场的情况往往是App想要访问系统应用的通讯数据,比如查看联系人,短信,通话记录等等,以及对这些通讯数据及逆行增删改查。首先要给AndroidMaifest.xml中添加响应的权限配置 下面是往手机通讯录添加联系人信息的例子效果如下分成三个步骤先查出联系人的基本信息,然后查询联系人号码,再查询联系人邮箱代码 ContactAddActivity类packagecom.example.chapter07;importandroid

  8. Android 10.0 设置默认launcher后安装另外launcher后默认Launcher失效的功能修复 - 2

    1.前言 在10.0的系统rom定制化开发中,在系统中有多个launcher的时候,会在开机进入launcher的时候弹窗launcher列表,让用户选择进入哪个launcher,这样显得特别的不方便所以产品开发中,要求用RoleManager的相关api来设置默认Launcher,但是在设置完默认Launcher以后,在安装一款Launcher的时候,默认Launcher就会失效,在系统设置的默认应用中Launcher选项就为空,点击home键的时候会弹出默认Launcher列表,让选择进入哪个默认Launcher.所以需要从安装Launcher的流程来分析相关的设置。来解决问题设置默认La

  9. Ruby 浮点精度 - 2

    据我了解,Ruby(1.9.2)float的精度为15位十进制数字。因此,我希望将floatx舍入到小数点后15位将等于x。对于此计算,情况并非如此。x=(0.33*10)x==x.round(15)#=>false顺便说一句,四舍五入到16位返回true。你能给我解释一下吗? 最佳答案 部分问题是0.33在底层格式中没有精确的表示,因为它不能用一系列1/2n项来表示。因此,当它乘以10时,乘以的数字与0.33略有不同。就此而言,3.3也没有精确表示。第一部分当数字没有精确的10进制表示时,在转换尾数中有信息的最低有效位时会有余数。

  10. AiBote 2022 新研发的自动化框架,支持 Android 和 Windows 系统。速度非常快 - 2

    Ai-Bot基于流行的Node.js和JavaScript语言的一款新自动化框架,支持Windows和Android自动化。1、Windowsxpath元素定位算法支持支持Windows应用、.NET、WPF、Qt、Java和Electron客户端程序和ie、edgechrome浏览器2、Android支持原生APP和H5界面,元素定位速度是appium十倍,无线远程自动化操作多台安卓设备3、基于opencv图色算法,支持找图和多点找色,1080*2340全分辨率找图50MS以内4、内置免费OCR人工智能技术,无限制获取图片文字和找字功能。5、框架协议开源,除官方node.jsSDK外,用户可

随机推荐