如何在mp3上实现seek

2024-01-11

我即将进入一个涉及解码+播放 mp3 流的项目。

我有一个Java解码器(JLayer),但据我所知它没有搜索功能(我不使用内置播放器,我需要实现我自己的播放器)。

另外,流是加密的,所以我需要实时解密+解码 - 不能拥有整个解密文件。

那么如何在 mp3 流上进行搜索呢?我想设置一个时间值,并获取文件中适当的偏移量进行解码。

另请考虑支持 VBR。

Thanks


我一直在寻找完全相同的东西。 JLayer的代码有点乱。仅仅浏览一下它就让我确信 mp3 解码核心是编写的(或从某处获取的),然后移植到 Java,然后添加了一个额外的(相当不理想的)层。任何状况之下。要寻求查看播放器中的代码(http://code.google.com/p/jesuifoo/source/browse/trunk/src/javazoom/jlgui/basicplayer/BasicPlayer.java?r=23)

    /**
     * Skip bytes in the File inputstream. It will skip N frames matching to
     * bytes, so it will never skip given bytes length exactly.
     * 
     * @param bytes
     * @return value>0 for File and value=0 for URL and InputStream
     * @throws BasicPlayerException
     */
    protected long skipBytes(long bytes) throws BasicPlayerException {
            long totalSkipped = 0;
            if (m_dataSource instanceof File) {
                    log.info("Bytes to skip : " + bytes);
                    int previousStatus = m_status;
                    m_status = SEEKING;
                    long skipped = 0;
                    try {
                            synchronized (m_audioInputStream) {
                                    notifyEvent(BasicPlayerEvent.SEEKING,
                                                    getEncodedStreamPosition(), -1, null);
                                    initAudioInputStream();
                                    if (m_audioInputStream != null) {
                                            // Loop until bytes are really skipped.
                                            while (totalSkipped < (bytes - SKIP_INACCURACY_SIZE)) {
                                                    skipped = m_audioInputStream.skip(bytes
                                                                    - totalSkipped);
                                                    if (skipped == 0)
                                                            break;
                                                    totalSkipped = totalSkipped + skipped;
                                                    log.info("Skipped : " + totalSkipped + "/" + bytes);
                                                    if (totalSkipped == -1)
                                                            throw new BasicPlayerException(
                                                                            BasicPlayerException.SKIPNOTSUPPORTED);
                                            }
                                    }
                            }
                            notifyEvent(BasicPlayerEvent.SEEKED,
                                            getEncodedStreamPosition(), -1, null);
                            m_status = OPENED;
                            if (previousStatus == PLAYING)
                                    startPlayback();
                            else if (previousStatus == PAUSED) {
                                    startPlayback();
                                    pausePlayback();
                            }
                    } catch (IOException e) {
                            throw new BasicPlayerException(e);
                    }
            }
            return totalSkipped;
    }

此例程说明了如何在不解码的情况下推进比特流。(m_audioInputStream.skip(...))。我不知道它是从一开始就跳过的(毕竟之前有一个 initAudioStream 调用),还是从当前的播放位置跳过。

VBR 没有问题,因为帧是单独跳过的。

关于解密,这并不重要,因为该例程会跳过从输入流读取的各个帧。如果输入流支持解码,它应该可以工作。当然有多快是另一个问题。在这种情况下,最好建立 mp3 的索引,以便您知道跳转和解码到哪个位置,但这是一个稍微不同的主题:如何在加密流中查找。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在mp3上实现seek 的相关文章

  • 将所有 BigDecimal 运算设置为特定精度?

    我的Java程序以高精度计算为中心 需要精确到至少120位小数 因此 程序中所有非整数都将由 BigDecimal 表示 显然 我需要指定 BigDecimal 的舍入精度 以避免无限小数表达式等 目前 我发现必须在 BigDecimal
  • Java泛型 - 实现像map这样的高阶函数

    我决定用 Java 编写一些常见的高阶函数 map filter reduce 等 这些函数通过泛型实现类型安全 但我在一个特定函数中遇到通配符匹配问题 为了完整起见 函子接口是这样的 The interface containing th
  • 在java中将RFC3339 DateTime转换为Date [重复]

    这个问题在这里已经有答案了 如何转换RFC 3339 https www rfc editor org rfc rfc3339java 中的 com google api client util DateTime 到 DateTime 例如
  • 如何调试使用maven构建的android应用程序

    我目前正在尝试从 Eclipse 调试我的设备上的 Android 应用程序 设备已添加 我可以在控制台和 Eclipse 中看到它 控制台 Windows adb devices List of devices attached 0019
  • 如何在谷歌地图中使用latlng字符串数组绘制多边形

    在我的应用程序中 我有包含 imagview 的 recyclerview 并且该 imageview 通过使用我存储在 sqlite 中的坐标包含静态地图图像 当我单击该图像时 我将该字符串数组格式的坐标传递给其他地图活动 然后使用该字符
  • 在 Java 8 中将对象追加到列表并返回结果?

    有没有一种方法可以将对象附加到列表并以功能性非命令方式在一行中返回结果 如果原始列表也不应该被改变 你会怎么做 Java 8 是允许的 我已经知道如何将两个列表连接到一行中 Source https stackoverflow com a
  • 使用Java获取CSS文件中图像的URL?

    我正在尝试使用 Java 获取远程 CSS 文件中图像 所有 MIME 类型 的 URL 我正在使用 jsoup 来获取 css 的 URL 经过无数个小时的观看CSS解析器 http cssparser sourceforge net 由
  • 运行单个 Java 线程的双核 CPU 利用率[重复]

    这个问题在这里已经有答案了 可能的重复 多线程 Java 应用程序能否很好地利用多核机器 https stackoverflow com questions 1649402 would a multithreaded java applic
  • 为什么 hibernate 在一张表中保存两个 @OneToMany 列表?

    想象一下使用 Hibernate 和 JPA 的简化代码如下 Entity class C Id GeneratedValue public long id MappedSuperclass abstract class A Id Gene
  • 使用 google-api-java-client 的 2 足 OAuth

    有谁知道如何将 2 legged OAuth 与 google api java client 一起使用 我正在尝试访问 Google Apps 配置 API 以获取特定域的用户列表 以下不起作用 HttpTransport transpo
  • 通过 JDBC 连接到 DB2 时的用户和密码

    我正在尝试连接到本地 DB2 10 5 Express C 服务器 这是一个测试环境 所以我不关心安全性 我能够连接到命令行处理器 在 Windows 上运行 并且我更改了配置设置AUTHENTICATION CLIENT and TRUS
  • Maven 2 未运行 Junit 4 测试

    我在确保运行 Junit4 测试时遇到问题 同样的问题也被报告在https stackoverflow com questions 2021771 sort newest sort top https stackoverflow com q
  • 维护插入顺序的并发集合[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个可以维护插入顺序的并发列表 有人有什么好的推荐吗 我看一些番石榴 例如SetFromMa
  • 为什么java(>=7版本)不支持运行没有main方法的程序? [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 class WithoutMain static System out println Without main class Sy
  • iText7 将 SVG 添加到 PdfDocument 中以及可能出现的问题

    关于问题的答案 如何使用 iText7 将 SVG 添加到 PDF 这是一个链接点击这里 https stackoverflow com questions 50059456 how to add an svg to a pdf using
  • 通过 ssh 发送命令并读取输出结果

    我有代码通过 ssh 连接到远程服务器并向其发送 2 个或更多命令 例如 cd export home ops bin和 viewlinkload time 20131205 19 但我没有看到命令执行 也没有收到结果 我需要获取服务器返回
  • 使用 InputStream 通过 TCP 套接字接收多个图像

    每次我从相机捕获图像时 我试图将多个图像自动从我的 Android 手机一张一张地发送到服务器 PC 问题是read 函数仅在第一次时阻塞 因此 从技术上讲 只有一张图像被接收并完美显示 但在那之后当is read 回报 1 该功能不阻塞
  • 删除Java中重载的方法

    有2个重载方法 这些方法中的每一个都将一种类型的列表转换为不同类型的列表 但第一种方法使用比较器 class SomeClass public static
  • 混合语言源目录布局

    我们正在运行一个使用多种不同语言的大型项目 Java Python PHP SQL 和 Perl 到目前为止 人们一直在自己的私有存储库中工作 但现在我们希望将整个项目合并到一个存储库中 现在的问题是 目录结构应该是什么样的 我们应该为每种
  • 在没有 ODBC 的情况下从 Java 操作 Access 数据库

    我想从我的 Java 项目操作 Microsoft Access 数据库 accdb 或 mdb 文件 我不想使用 Microsoft 的 JDBC ODBC Bridge 和 Access ODBC 驱动程序 因为 JDBC ODBC 桥

随机推荐

  • 持有多个锁的线程进入 wait() 状态。它会释放所有持有锁吗?

    我编写了这个程序来检查线程 t1 是否持有两个不同对象的锁 Lock class 和 MyThread class 使用 MyThread class wait 在 MyThread class 实例上进入等待模式 它不会释放 Lock c
  • 使用 v4 Fragments API 实现 ActionBar 选项卡

    我的应用程序当前使用 Fragments v4 兼容性包来支持 Android 版本一直到 1 6 这意味着我的所有片段都继承自兼容包的版本Fragment 我目前正在尝试重新设计应用程序的部分内容以利用 Honeycomb 功能 例如Ac
  • 使用 Kendo Grid 获取数据时日期格式发生变化

    我正在尝试使用一些参数获取数据并将其加载到剑道网格中 但是当我使用日期参数时 日期格式正在改变 因此在服务器端显示错误的日期 作为我使用的参数的示例 new Date April 01 2016 但在服务器端它变成 04 01 2016 这
  • Internet Explorer toDataURL() 替代方案?

    所以我需要保存在a上绘制的图像数据
  • C libm.a 编译时不需要链接

    我试图编译一个源文件 其中包括
  • RegEx:如果lookbehind显示小写,则删除换行符

    我正在 Notepad 中执行 CTRL H 查找和替换 我想找到所有换行符后跟小写字符 以便用空格字符替换它们 从而删除文本中不需要的换行符 Find r n A Z 0 9 代替 在此插入空格字符 确保您选择了 相符 and 正则表达式
  • boost是如何实现信号和槽的?

    要继续另一个问题 我们问这个 Boost是如何实现信号 槽机制的 See 信号和槽是如何在底层实现的 https stackoverflow com questions 1406940 how signal and slots are im
  • 什么是快照构建/源版本?

    什么是快照构建 源版本 具体到 JDK 7 快照版本供用户在平台仍在开发时下载和查看 http www oracle com technetwork java javase downloads ea jsp 142245 html http
  • R 以相似字符串开头的不同列组的行总和

    我对 R 还很陌生 这是我第一次敢在这里提问 我正在使用具有李克特量表的数据集 并且我想对不同组的列进行求和 这些列共享其名称中的第一个字符串 下面我构建了一个只有 2 行的数据框来说明我遵循的方法 尽管我希望收到有关如何编写更有效的方法的
  • Ajax 传递空值但控制器在 ASP.NET MVC 中获取 null

    我正在与ASP NET MVC并且发送的值有问题Ajax到我的控制器 假设我有SampleViewModel像这样 public class SampleViewModel private string firstName string E
  • Conda:将本地开发包安装到单个 conda 环境中

    如果我使用 virtualenv 我将激活项目的虚拟环境 然后安装我正在开发模式下开发的包 像下面这样 workon superbad pip install e fnawesome 这允许我的包裹fnawesome可以通过我的中的任何代码
  • C++中多重继承的限制

    C 中多重继承的限制是什么 即一个类可以继承多少个类 它是否依赖于实现 或者对多重继承中可以继承的类的数量是否有限制 它是实现定义的 C 11 给出了推荐的最小值实施数量标准部分 直接和间接基类 16 384 单个类的直接基类 1 024
  • JavaScript。无法在 safari 中打开新标签

    以下 JavaScript 可以在 Firefox Chrome 和 IE 中打开一个新选项卡 但它会在 Safari 中打开一个新窗口 javascript window open url blank opens new window i
  • Maven 插件自动生成 setter/getter?

    是否有一个 Maven 插件可以自动生成具有相应 JavaDocs 的 setter 和 getter 我知道 Eclipse Netbeans 会在您告诉它时执行此操作 然而 源代码最好只包含框架并让 Maven 或其他工具生成重复的内容
  • 如何在 Bash 中对数组进行排序

    我在 Bash 中有一个数组 例如 array a c b f 3 5 我需要对数组进行排序 不仅仅是以排序的方式显示内容 而是获取包含排序后的元素的新数组 新的排序数组可以是全新的 也可以是旧的 您实际上并不需要那么多代码 IFS n s
  • jQuery 注释/取消注释

    我正在寻找一种使用 jQuery 将元素包装到注释中的方法 例如 还有一种删除评论的方法 这可能吗 要使用注释包装元素 或者更具体地说 用具有该元素 HTML 的注释节点替换元素 my element jq my element comme
  • 为什么 Chrome 和 FireFox 控制台打印“未定义”?

    获取这个简单的测试对象并将其粘贴到控制台中 你会看到它说undefined 该对象正在工作 因为它还打印123 但是什么是undefined about Test var Test new function return get testi
  • 如何使用选择参数从 android 中的 contentprovider 查询特定行

    我已经构建了一个基本的内容提供程序 用于存储用于学习目的的 SMS 消息 到目前为止我可以读取 无需选择参数 插入 更新和删除 然而 我一直在尝试弄清楚如何格式化我的提供程序中 WHERE 子句的选择参数 基本上我的应用程序需要搜索特定的时
  • 如何隐藏 SWT 组合以使其不占用空间?

    我需要隐藏一个组合 以及里面的所有孩子 只需设置setVisible false 将保留组合的空间 Composite outer new Composite parent SWT NONE outer setLayout new Grid
  • 如何在mp3上实现seek

    我即将进入一个涉及解码 播放 mp3 流的项目 我有一个Java解码器 JLayer 但据我所知它没有搜索功能 我不使用内置播放器 我需要实现我自己的播放器 另外 流是加密的 所以我需要实时解密 解码 不能拥有整个解密文件 那么如何在 mp