为什么上传的音频在上传明显成功时损坏?

2022-08-30 20:08:14

我已经使用JavaScript,PHP和Cordova进行了上传。一切都很好。但是当我尝试在浏览器或Windows Media Player等桌面播放器中打开上传的mp3时,它说文件已损坏。任何想法为什么会发生这种情况?

我还必须说,当我在浏览器中检查损坏的文件时,它具有视频标签而不是音频标签。

我的代码:

//method to upload the audio
function uploadAudio(recordedSrc) {
  var win = function(r) {
    console.log("Code = " + r.responseCode);
    console.log("Response = " + r.response);
    console.log("Sent = " + r.bytesSent);
  }

  var fail = function(error) {
    alert("An error has occurred: Code = " + error.code);
    console.log("upload error source " + error.source);
    console.log("upload error target " + error.target);
  }

  var options = new FileUploadOptions();
  options.fileKey = "file";
  options.fileName = "recordupload.mp3";
  options.mimeType = "audio/mpeg";
  console.log(options);

  var ft = new FileTransfer();
  console.log(ft);
  console.log(recordedSrc);
  ft.upload(recordedSrc, encodeURI(app_url + "json/upload.php"), win, fail, options);
}
$('.upload').on('click', function(e) {
  e.preventDefault();
  //Method to upload Audio file to server
  uploadAudio(mediaRecSrc);
});

PHP 中的服务器端处理脚本:

<?php
// Where the file is going to be placed
$target_path = dirname(__FILE__) . "/uploaded_records/";
if (!file_exists($target_path)) {
    mkdir ($target_path, 0777);
}
/* Add the original filename to our target path.
Result is "uploads/filename.extension" */
$target_path = $target_path . basename( $_FILES['file']['name']);
$path = $_FILES['file']['name'];
$ext = pathinfo($path, PATHINFO_EXTENSION);
var_dump("ext is: " . $ext);

if(move_uploaded_file($_FILES['file']['tmp_name'], $target_path)) {
    echo "The file ".  basename( $_FILES['file']['name']).
    " has been uploaded";
} else{
    echo "There was an error uploading the file, please try again!";
    echo "filename: " .  basename( $_FILES['file']['name']);
    echo "target_path: " .$target_path;
}
?>

更新

似乎问题出在文件(在Android上可以播放)。我通过USB设备复制了文件并尝试播放它,但存在相同的问题,该文件无法播放。我不得不说,该文件是使用cordova的媒体插件录制的。也许这就是问题所在,对吧?

第二次更新

我录制并上传了一个文件作为格式,并将其转换为在线这里,声音工作。关于如何解决这个问题的任何想法?.amr.mp3


答案 1

它可能以玩家无法理解的方式进行编码。一些播放器仅支持以某种方式编码的音频,不支持某些编码方法,例如可变比特率,高比特率(320kbps +)或DRM
作为应用程序开发人员,您可以自由使用任何 Android 驱动的设备上提供的任何媒体编解码器,包括 Android 平台提供的编解码器和特定于设备的编解码器。但是,最佳做法是使用与设备无关的 Android 媒体格式的媒体编码配置文件。mp3mp3mp3mp3

你最初是如何制作文件的?我在Android上制作音频文件,它们在.mp33gpVLC Media Player

Android设备上的Cordova自适应多速率格式录制音频。指定的文件应以 结尾。amr extension.(这不是一个选择,这是一个事实)。

// Record audio
// 
function recordAudio() {
    var src = "myrecording.amr";
    var mediaRec = new Media(src, onSuccess, onError);

    // Record audio
    mediaRec.startRecord();

    // Stop recording after 10 sec
    var recTime = 0;
    var recInterval = setInterval(function() {
        recTime = recTime + 1;
        setAudioPosition(recTime + " sec");
        if (recTime >= 10) {
            clearInterval(recInterval);
            mediaRec.stopRecord();
        }
    }, 1000);
}

AMR文件不是音频标签支持的受支持音频文件之一。请参阅此列表了解支持的音频格式:html5 支持的音频格式html5

文件转换参见:转换

如果您不知道是什么,请参阅我的stackoverflow快速安装指南:
Cordova快速安装以及教程的链接。Cordova

如果你想要android.wav输出这里很有趣(android没有.wav编解码器!)(未经我测试,但我知道这种代码,似乎不错)。)。


答案 2

您可能正在以ASCII而不是二进制文件上传文件?我对PHP不是很好,但对我来说,似乎你很可能需要告诉一些东西,它是一个二进制文件而不是文本。可能是您可以在选项中指定的内容。