我正在使用phonegap媒体将音频录制为mp3。录制后,它在我的Android上播放正常,并在Windows Media Player上正常播放。但是,当我在浏览器中尝试它时,它说该文件已损坏。
确切错误:
Chrome:“我们现在无法播放此音频文件。”
Firefox:“由于文件已损坏,无法播放视频。”
IE:在WMP中打开文件并播放。
我使用了示例中的代码。 http://docs.phonegap.com/en/2.6.0/cordova_media_media.md.html#media.startRecord
// Record audio
//
function recordAudio() {
var src = "myrecording.mp3";
var mediaRec = new Media(src,
// success callback
function() {
console.log("recordAudio():Audio Success");
},
// error callback
function(err) {
console.log("recordAudio():Audio Error: "+ err.code);
});
// Record audio
mediaRec.startRecord();
}
提前致谢。
编辑:
这是一个例子。 http://blrbrdev.azurewebsites.net/voice/blrbr_130419951008830874.mp3 这在WMP中播放,但不在浏览器中播放。
答案 0 :(得分:2)
您作为mp3提供的文件似乎不是mp3文件。 我在下面附上了文件的详细信息。如您所见,它是在MPEG-4 / 3GPP容器中打包的AMR编解码器。我想说当前没有浏览器可以解码本机(但像VLC这样的软件可以播放它)。
如果您尝试在浏览器中播放音频文件 - 无论是HTML5音频 - 您需要提供兼容的格式。在这里查看compatibility table。
预期行为为stated here:
Android设备以自适应多速率格式录制音频。指定的文件应以.amr扩展名结尾。
如果您想在浏览器/ HTML5音频标签中播放,则需要对文件进行后处理以将其转换为有效的mp3文件(为完整的浏览器覆盖添加ogg音频)。服务器端可以使用名为ffmpeg的程序来完成。我不是Phonegap开发的专家,所以我不能指向一个有效的lib来做那个客户端,但也许这已经被问过了。
文件规格:
General
Complete name : C:\wamp\www\stack\sample\thisTest.mp3
Format : MPEG-4
Format profile : 3GPP Media Release 4
Codec ID : 3gp4
File size : 10.5 KiB
Duration : 4s 780ms
Overall bit rate mode : Constant
Overall bit rate : 18.0 Kbps
Performer : LGE
Encoded date : UTC 2014-04-15 00:24:57
Tagged date : UTC 2014-04-15 00:24:57
Audio
ID : 1
Format : AMR
Format/Info : Adaptive Multi-Rate
Format profile : Narrow band
Codec ID : samr
Duration : 4s 780ms
Bit rate mode : Constant
Bit rate : 12.8 Kbps
Channel(s) : 1 channel
Sampling rate : 8 000 Hz
Bit depth : 13 bits
Stream size : 7.47 KiB (71%)
Title : SoundHandle
Writing library :
Language : English
Encoded date : UTC 2014-04-15 00:24:57
Tagged date : UTC 2014-04-15 00:24:57
答案 1 :(得分:2)
首先感谢@ Forestan06指出我正确的方向。
对于那些以.amr格式在Android设备上录制并且需要使用.Net C#在您的服务器上录制.mp3格式的录制内容的人,这就是我的做法。
编写此代码:
var fileName ="myVoice.mp3";
string fileNameWithPath = Server.MapPath("~/Voice/" + fileName);
if (request.FileName.EndsWith(".amr"))
{
var amrFileName = "myVoice.amr";
string amrFileNameWithPath = Server.MapPath("~/Voice/Amr/" + amrFileName);
request.SaveAs(amrFileNameWithPath);
var inputFile = new MediaFile { Filename = amrFileNameWithPath };
var outputFile = new MediaFile { Filename = fileNameWithPath };
using (var engine = new Engine())
{
engine.Convert(inputFile, outputFile);
}
}
else
{
request.SaveAs(fileNameWithPath);
}