明明上传成功了,为什么上传的音频是乱码?
Why uploaded audio is corrupt when upload is clearly successful?
我使用 JavaScript、PHP 和 Cordova 进行了上传。一切正常。但是当我尝试在浏览器或 Windows 媒体播放器等桌面播放器中打开上传的 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
here 并且声音正常。知道如何解决这个问题吗?
您上传的文件很可能是 ASCII 格式而不是二进制格式?我对 PHP 不太满意,但对我来说,您似乎很可能需要说明它是二进制文件而不是文本。可能您可以在选项中指定。
可能 mp3
的编码方式 mp3
玩家无法理解。某些 mp3
播放器仅支持以特定方式编码的音频,不支持某些编码方法,例如可变比特率、高比特率 (320kbps+) 或 mp3
的 DRM .
作为应用程序开发人员,您可以自由使用任何支持 Android 的设备上可用的任何媒体编解码器,包括 Android 平台提供的编解码器和特定于设备的编解码器。但是,最佳做法是使用与设备无关的媒体编码配置文件,
Android media formats.
您首先是如何制作 mp3
文件的?
我在 android 上制作了 3gp
个音频文件,它们在 VLC Media Player
上播放得很好。
Android 设备上的 Cordova 以自适应多速率格式录制音频 ].指定的文件应以 .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 supported audio formats
文件转换见:
convert
如果您不知道 Cordova
是什么,请参阅我的 Whosebug 快速安装指南:
以及指向教程的链接。
我使用 JavaScript、PHP 和 Cordova 进行了上传。一切正常。但是当我尝试在浏览器或 Windows 媒体播放器等桌面播放器中打开上传的 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
here 并且声音正常。知道如何解决这个问题吗?
您上传的文件很可能是 ASCII 格式而不是二进制格式?我对 PHP 不太满意,但对我来说,您似乎很可能需要说明它是二进制文件而不是文本。可能您可以在选项中指定。
可能 mp3
的编码方式 mp3
玩家无法理解。某些 mp3
播放器仅支持以特定方式编码的音频,不支持某些编码方法,例如可变比特率、高比特率 (320kbps+) 或 mp3
的 DRM .
作为应用程序开发人员,您可以自由使用任何支持 Android 的设备上可用的任何媒体编解码器,包括 Android 平台提供的编解码器和特定于设备的编解码器。但是,最佳做法是使用与设备无关的媒体编码配置文件,
Android media formats.
您首先是如何制作 mp3
文件的?
我在 android 上制作了 3gp
个音频文件,它们在 VLC Media Player
上播放得很好。
Android 设备上的 Cordova 以自适应多速率格式录制音频 ].指定的文件应以 .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 supported audio formats
文件转换见: convert
如果您不知道 Cordova
是什么,请参阅我的 Whosebug 快速安装指南: