php - 流式传输 MP3 会切断最后 1-2 秒的音频

标签 php apache audio mp3 audio-streaming

我已经搜索并搜索了相当多的内容,但没有任何东西能够真正解决我的问题。

我的服务器上有一个 mp3 文件,我需要将它提供给我的最终用户,以便他们可以听到录音并验证它是否正确。问题是在收听时,浏览器(至少是 Safari 和 Chrome)会切断录音的最后 1-2 秒。 (这不是很有帮助。

我已经尝试过的东西。

  • 直接从服务器下载文件,它确实可以播放
    正确。
  • 使用 file 验证浏览器 mp3 文件的 mime 类型它是音频/mpeg;字符集=二进制
  • 通过浏览器和文件下载文件和
    我的服务器文件是完全相同的字节。文件显示(对于
    例如)它们有 9 秒长,但是当我在浏览器中播放时
    它显示文件只有 7 秒长。
  • 搞砸了文件的标题,没有运气。
    header("Content-Type: audio/mpeg; charset=binary");
    header("Content-Disposition: inline; filename=\"{$filename}\"");
    header('Pragma: no-cache');
    header("Content-Length: ". filesize($file_path));
    readfile($file_path);
    

  • 我几乎已经将问题缩小到从调用服务器上的文件到将其带到我的浏览器中发生的事情。我尝试过的东西并没有真正帮助。我的要求之一是我必须将此 protected 并且不在公共(public)目录中,因此我必须通过 PHP 提供它,因为用户必须经过身份验证才能播放文件。任何想法将不胜感激。

    如果有帮助,这里有一些版本。
    CentOS 7.4.1708
    Apache 2.4.6
    PHP 5.6.30
    Chrome Version 60.0.3112.113
    Safari Version 10.1.2 (12603.3.8)
    

    更新
    The data from the main wav file I'm receiving is the following
    Duration: 00:09
    Audio Channels: 1
    Sample Rate: 8,000
    Bits Per Sample: 16
    

    最佳答案

    很多音频播放器,尤其是 MP3 周围的播放器,都非常有问题。他们将使用固定大小的缓冲区之类的东西。此外,您应该知道,使用 MP3 无法在不解码整个文件的情况下精确设置搜索点。关于文件长度、字节偏移和猜测有很多技巧/窍门,但仅此而已。基本上,对于没有容器或比特流格式指示时间的有损编码音频,您永远无法期望时间是正确的。我确实认为完全播放您的文件是合理的。

    您还应该知道您的采样率和比特率都非常低,尤其是在使用立体声音频时。

    某处可能有一个固定大小的缓冲区,预计会有 8KB 的数据,但由于采样率和比特率低,它只得到了一小部分。这将是一个播放器错误,如果没有提交错误报告,您无法直接对此进行处理。

    考虑作品?您将获得更高的质量,并且非常兼容。如果做不到这一点,请考虑直接使用 PCM。

    关于php - 流式传输 MP3 会切断最后 1-2 秒的音频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46281804/

    相关文章:

    html - 网页需要的文件放在哪里

    apache - 基于子域名的 http 到 https 重定向

    c++ - Visual Studio 2010 的 apache hadoop 源代码中的 "Error: expected a declaration"

    android - 音频数据字节的含义是什么?安卓

    flash - 每个结束时按顺序播放声音

    php - 任何导致内部服务器错误的 .php 文件

    php - Paypal 休息沙盒错误

    php - PDO 参数根本不起作用

    php - 从缩小图像转换选择坐标

    javascript - HTML5/JS 选择合适音频源的简单方法是什么?