php - 通过连接和 header ('Content-Type: audio/mpeg' 使用 php 合并 mp3 音频是否正确?

标签 php merge mp3 captcha

我已经构建了一个简单的 CAPTCHA PHP 脚本,现在我正在尝试创建一个脚本,为视力不好或根本看不见的人生成 mp3 音频。我的目标只是挑战自己,所以我不想使用外部库,但我会很感激一些帮助。我尝试使用 file_put_contents() 函数合并音频(每个字母都有一个 mp3 音频),令我惊讶的是,它起作用了,但对我来说,像加入文本文件一样加入音频文件似乎是不正确的。 所以我的第二次尝试是这样做:

<?php
    session_start();
    $letter_array = str_split($_SESSION["captcha"]); //this is an array with the letters of the captcha
    header('Content-Type: audio/mpeg');
    header('Cache-Control: no-cache');
    header('Pragma: no-cache');
    header('Expires: 0');
    $audio = '';
    foreach ($letter_array as $letter) {
        $audio .= file_get_contents("audios/".$letter.".mp3");
    }
    echo $audio;
?>

然后我可以将这个文件嵌入到 HTML 中的一个标签中,它也可以工作。我知道这两种解决方案本质上都是相似的,但我发现第二种方式更简洁。我的问题是:虽然它工作正常,但以这种方式做这样的事情是否可以,或者是错误的,还是不推荐的?我不太了解编码和 mp3 文件的结构,所以我不知道这个解决方案是否适用于所有人。我也乐于接受建议
谢谢

最佳答案

大多数情况下,是的。

普通的 MP3 文件只是一系列 MPEG 帧。只要它们具有相同的采样率和 channel 数,您就可以安全地连接它们。您可以混合和匹配比特率。

虽然有一些注意事项。首先,MP3 文件通常带有 ID3 标签。您会想要丢弃这些标签,因为它们应该位于特定位置。

此外,了解位库也很重要。这对您来说不是问题,因为您连接的是完全编码的文件,但如果您必须拆分一个流,请务必注意来自一个流的数据可以放入其他帧中。这是为了允许在更复杂的帧上使用更多的带宽,而在不需要的地方使用更少的带宽。

不过,归根结底,您真的不应该构建自己的验证码。对于某人来说,编写可能 5 行代码来匹配您的音频样本并挑选出数字是微不足道的。更不用说,您可能会造成可访问性问题。我强烈建议您查看 Google reCAPTCHA。当前版本对您的用户没有干扰,并且可能比您提议的版本安全得多。 https://www.google.com/recaptcha/intro/v3.html

关于php - 通过连接和 header ('Content-Type: audio/mpeg' 使用 php 合并 mp3 音频是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63142248/

相关文章:

php - 如何将这两个查询合并为一个?

python - 将不同数据帧的行合并在一起

iphone - iOS:在设备上创建 MP3

php - ZendFramework - 如何知道执行了哪个 Controller 和哪个特定方法?

php - 如何在PHP中动态创建具有多个字段的表

php - 如何选择每第n条记录?

php - 通过命令行将 *(mp3、m4p 等)转换为 OGG 以兼容 HTML5

php - 从脚本语言中调用 shell 命令会降低性能吗?

arrays - 为什么合并 M 个排序数组的复杂度是线性时间?

c# - 使用 TagLibSharp 读取 APEv2 mp3 标签?