android - 如何从服务器下载一部分mp3?

标签 android audio ffmpeg mp3 android-ffmpeg

用例

我的用例大致等于,将 15 秒的 mp3 文件添加到约 1 分钟的视频。所有转码合并部分将由 FFmpeg-android 完成,所以现在这不是问题。

流程如下

  • 用户可以选择 mp3 的任意 15 秒(ExoPlayer 流式传输)(考虑 192Kbps/44.1KHz 的 3 分钟 = 最多 7MB)
  • 然后下载仅 15 秒的部分并将其添加到视频的音频流中。 (使用 FFmpeg)
  • 使用获得的输出

尝试过的解决方案

  • Extracting fragment of audio from a url

    RANGE_REQUEST - 我使用提供的示例文件在 Kotlin 中复制了完全相同的算法/公式。但输出不准确 (± 1.5 secs * c) 其中 c 与 startTime 成正比

  • How to crop a mp3 from x to x+n using ffmpeg?

    FFMPEG_SS - 这可以完美地将远程 URL 作为输入,但有两个缺点,

    1. 随着 startTime 的增加,下载字节的大小更接近 mp3 的实际大小。
    2. ffmpeg-android 不支持网络请求模块(至少我们遵守的方式)

所以以上两个解决方案都没有取得成果,目前,我正在下载整个文件并在本地进行修整,这绝对是一个糟糕的用户体验。 我想知道 Instagram 将音乐添加到故事功能中的效果如何,因为这与我想要实现的很接近。

最佳答案

你想要的方式是不可能的。 mp3 文件没有时间戳。如果你只是跳到 mp3 的中间,(并寻找帧开始标记),然后开始解码,你不知道这个帧是在什么时间,因为帧是可变大小的。唯一知道的方法是计算当前位置之前的帧数。这意味着您需要整个文件。

关于android - 如何从服务器下载一部分mp3?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63482985/

相关文章:

node.js - 使用 node fluent-ffmpeg 将图像转换为视频

android - 为什么不能直接访问本地服务?

java - Android 2.2 版本的 SSL 握手失败

java.lang.OutOfMemoryError 在 android 中加密大文件

ios - 如何提高 MPMediaItem 的频率范围? (类似于参数均衡器,例如,将 500 Hz 提升 12 dB)

javascript - soundcloud 如何隐藏流媒体音频的 URL

node.js - 使用管道字符 |与 child_process 产卵

android - Android 上的 ffmpeg 解码

java - 我需要这样的设计,但我面临两个问题

c# - 如何从 .wav 声音进入双 [] C#