【问题标题】:How to download a part of mp3 from server?如何从服务器下载部分 mp3?
【发布时间】:2020-12-08 11:40:31
【问题描述】:

用例

我的用例大致相当于,将 15 秒的 mp3 文件添加到约 1 分钟的视频中。所有转码合并部分都将由 FFmpeg-android 完成,所以现在不用担心。

流程如下

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

尝试过的解决方案

  • Extracting fragment of audio from a url

    RANGE_REQUEST - 我使用提供的确切示例文件在 Kotlin 中复制了完全相同的算法/公式。但是输出不准确(± 1.5 secs * c) where c is proportional to startTime

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

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

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

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

【问题讨论】:

  • 你需要一个服务器,你可以告诉它你需要从某个时间开始的 11 秒的文件。就是这样。
  • 你认为没有相同的客户端唯一实现吗?
  • 不这么认为。如果服务器只提供完整的文件,那么客户端应该从头开始下载。但是当然可以在 starttime+interval 之后停止下载。

标签: android audio ffmpeg mp3 android-ffmpeg


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-15
    相关资源
    最近更新 更多