2016-09-14 40 views
21

Tôi đã tải lên bằng JavaScript, PHP và Cordova. Mọi thứ đều hoạt động tốt. Nhưng khi tôi cố gắng để mở mp3 tải lên trong trình duyệt hoặc máy nghe nhạc một máy tính để bàn như Windows Media Player, nó nói rằng tập tin bị hỏng. Bất kỳ ý tưởng tại sao điều này đang xảy ra?Tại sao âm thanh tải lên bị hỏng khi tải lên rõ ràng là thành công?

Tôi cũng phải nói rằng khi tôi kiểm tra tệp bị hỏng trong trình duyệt, nó có thẻ video thay vì thẻ âm thanh.

Mã của tôi:

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

máy chủ xử lý side script trong 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; 
} 
?> 

CẬP NHẬT:

Dường như vấn đề nằm bên trong file (mà trên công trình android đang chơi). Tôi đã sao chép các tập tin thông qua thiết bị USB và cố gắng chơi nó và có cùng một vấn đề, tập tin sẽ không chơi. Tôi phải nói rằng tệp được ghi bằng cách sử dụng plugin phương tiện từ cordova. Có lẽ đây là vấn đề, phải không?

THỨ HAI CẬP NHẬT:

tôi ghi lại và tải lên một tập tin như một định dạng .amr và chuyển đổi nó để .mp3 trực tuyến here và các công trình âm thanh. Bất kỳ ý tưởng về cách giải quyết vấn đề này?

+0

** ft.upload() ** thực sự đang làm gì? –

+0

@TodorKostov, nó xử lý việc tải lên, sử dụng AJAX. Nó gửi tệp infos đến tập lệnh upload.php. – Ionut

+0

rõ ràng là nó đang làm điều đó. Câu hỏi là thế nào? Có phải đó là điều bạn đã tự viết (nó có nghĩa là lỗi và lỗi có thể) HOẶC nó có phải là chức năng của bên thứ ba (điều đó cũng có nghĩa là lỗi có thể, nhưng ở mức độ thấp hơn)? Nếu nó đến từ một thư viện được sử dụng bởi hundrests của các nhà phát triển hoặc một cái gì đó như thế, thì có lẽ vấn đề là không theo cách bạn đang tải lên các tập tin. Điều này sẽ giúp chúng tôi tìm ra vấn đề. –

Trả lời

8

Có thể là mp3 được mã hóa theo cách mà trình phát mp3 không hiểu. Một số người chơi mp3 chỉ hỗ trợ âm thanh được mã hóa theo một cách nhất định và sẽ không hỗ trợ các phương pháp mã hóa nhất định như tốc độ bit thay đổi, tốc độ bit cao (320kbps +) hoặc mp3 với DRM.
Là nhà phát triển ứng dụng, bạn có thể sử dụng bất kỳ codec phương tiện nào khả dụng trên mọi thiết bị chạy Android, bao gồm cả các thiết bị do nền tảng Android cung cấp và những thiết bị cụ thể. Tuy nhiên, cách tốt nhất là sử dụng các cấu hình mã hóa phương tiện không phụ thuộc vào thiết bị, Android media formats.

Bạn đang tạo tệp mp3 ở vị trí đầu tiên như thế nào? Tôi tạo các tệp âm thanh 3gp trên Android và chúng hoạt động tốt trong VLC Media Player.

Cordova trên Android thiết bị ghi âm ở định dạngAdaptive Multi-Rate. Tệp được chỉ định phải kết thúc bằng a. amr mở rộng. (đây là KHÔNG một lựa chọn, đó là một thực tế).

// 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 tập tin không phải là một trong những tập tin âm thanh được hỗ trợ html5 thẻ âm thanh hỗ trợ.Xin vui lòng xem danh sách này cho các định dạng âm thanh hỗ trợ: html5 supported audio formats

Chuyển đổi tập tin see: convert

Nếu bạn không biết Cordova là gì, thấy stackoverflow tôi nhanh chóng cài đặt hướng dẫn:
Cordova quick install với các liên kết đến một hướng dẫn.

If you want android .wav output here is something interesting (android does not have a .wav codec !) (untested by me, but I know this kind of code, seems good).

+0

Xin chào. Cảm ơn bạn vì câu trả lời. Trên android, âm thanh phát tốt. Trên máy tính để bàn/máy tính xách tay cho biết nó bị hỏng. Để tạo tệp mp3, tôi sử dụng cordova [media plugin] (http://docs.phonegap.com/en/edge/cordova_media_media.md.html#media.startRecord) để ghi và lưu tệp. – Ionut

+0

Tôi sẽ kiểm tra những tùy chọn cấu hình mà Cordova có và kiểm tra chéo xem ứng dụng máy tính để bàn nào chấp nhận là hợp lệ. Tôi ghi lại âm thanh của riêng mình trên Android, tôi cũng sẽ kiểm tra các tệp của mình hoạt động trên máy tính để bàn. –

+0

Ok. Cảm ơn bạn đã dành thời gian giúp tôi. Tôi sẽ mong đợi câu trả lời của bạn. – Ionut

2

Có thể bạn đang tải lên tệp của mình bằng ASCII thay vì nhị phân? Tôi không tuyệt vời với PHP nhưng với tôi có vẻ như khá có khả năng bạn cần phải nói với một cái gì đó đó là một tập tin nhị phân chứ không phải là văn bản. Có lẽ một cái gì đó bạn có thể chỉ định trong các tùy chọn của bạn.

+0

Tôi không nghĩ đây là trường hợp của tôi. – Ionut

+0

Có thể đáng để kiểm tra. Nếu bạn đưa lên thanh tra web và tab mạng, bạn có thể thấy côn trùng các tiêu đề tải lên vv để đảm bảo. – Ryan

Các vấn đề liên quan