Подтвердить что ты не робот

Почему загруженный звук поврежден, когда загрузка явно успешна?

Я сделал загрузку с использованием JavaScript, PHP и Cordova. Все работает нормально. Но когда я пытаюсь открыть загруженный mp3 в браузере или настольном проигрывателе, таком как Windows Media Player, он говорит, что файл поврежден. Любая идея, почему это происходит?

Я также должен сказать, что, когда я проверяю поврежденный файл в браузере, у него есть видео теги вместо звуковых тегов.

Мой код:

//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);
});

Обработка на стороне сервера script в 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-устройство и попытался воспроизвести его, и есть та же проблема, файл не будет воспроизводиться. Я должен сказать, что файл записывается с использованием медиа-плагина из кордовы. Может быть, это проблема, верно?

ВТОРОЕ ОБНОВЛЕНИЕ:

Я записал и загрузил файл в формате .amr и преобразовал его в .mp3 онлайн здесь, и звук работает. Любая идея о том, как решить эту проблему?

4b9b3361

Ответ 1

Он может быть mp3 закодирован таким образом, что игрок mp3 не понимает. Некоторые проигрыватели mp3 поддерживают только аудиокодирование определенным образом и не будут поддерживать определенные методы кодирования, такие как переменная скорость передачи, высокие скорости передачи (320 кбит/с) или mp3 с помощью DRM.
Как разработчик приложений, вы можете использовать любой медиакодек, который доступен на любом устройстве на базе Android, в том числе и на платформе Android, и на устройствах, специфичных для устройства. Тем не менее, лучше всего использовать профили кодирования медиа, которые являются агностическими, Android-форматы для Android.

Как вы делаете файл mp3 в первую очередь? Я делаю 3gp аудиофайлы на android, и они отлично играют в VLC Media Player.

Кордова на Android устройства записать аудио в Adaptive Multi-Rate формате. Указанный файл должен заканчиваться расширением. amr. (это НЕ выбор, это факт).

// 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 аудиоформаты

Преобразование файлов см. в: конвертировать

Если вы не знаете, что такое Cordova, см. руководство по быстрой установке в stackoverflow: Кордова быстро установить со ссылками на учебник.

Если вы хотите, чтобы вывод android .wav здесь был чем-то интересным (у андроида нет .wav-кодека!) (непроверенный мной, но я знаю такой код, кажется хорошим).

Ответ 2

Вероятно, вы загружаете свои файлы в ASCII вместо двоичного? Я не очень хорош с PHP, но для меня, похоже, довольно вероятно, что вам нужно что-то сказать, это двоичный файл, а не текст. Вероятно, вы можете указать в своих вариантах.