在我的 Android 应用程序中,我尝试通过手机麦克风录制音频、播放它,并将其存储在 Parse.com 上。最终目标是允许其他设备传输音频文件。
我可以成功录制音频 - 以下是我的做法:(此处将格式指定为 .3gpp,但 .wav 也对我有用)
mRecorder = new MediaRecorder();
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
AudioRecordTest();
mRecorder.setOutputFile(mFileName);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
“mFileName”在此处设置:
mFileName = Environment.getExternalStorageDirectory().getAbsolutePath();
mFileName += "/audiorecordtest.3gpp";
我还可以播放该文件。效果很好。 然后我尝试将其作为解析文件保存到 Parse,并将其附加到解析对象。就像这样:
byte[] data = mFileName.getBytes();
ParseUser currentUser = ParseUser.getCurrentUser();
String usernameText = currentUser.getUsername();
String mUploadName = usernameText + "_recording.3gpp";
ParseFile file = new ParseFile(mUploadName, data);
file.saveInBackground();
ParseObject audioRecordings = new ParseObject("AudioRecording");
audioRecordings.put("Submitter", usernameText);
audioRecordings.put("AudioFile.3gpp", file);
audioRecordings.put("PositiveScore", 0);
audioRecordings.put("Negativescore", 0);
audioRecordings.put("Parent", currentUser);
audioRecordings.saveInBackground();
现在,我可以在 Parse.com 的数据浏览器上看到对象和文件。如果我单击音频文件,我会被带到音频播放器(因此 Parse 至少将其识别为音频),但它不会播放任何内容。所以文件有问题。
这是我用来传输音频的内容:
mPlayer = new MediaPlayer();
ParseQuery<ParseObject> query = ParseQuery.getQuery("AudioRecording");
query.getInBackground("YkfHDl2aEG", new GetCallback<ParseObject>() {
@Override
public void done(ParseObject recording, com.parse.ParseException e) {
if (e != null) { ... }
else {
ParseFile audioFile = recording.getParseFile("audioFile");
ParseFile audioFile = recording.getParseFile("audioFile");
String audioFileURL = audioFile.getUrl();
mPlayer = new MediaPlayer();
mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
try { mPlayer.setDataSource(audioFileURL); }
然后,我播放声音。我知道这部分是正确的,因为如果我用“http://www.pocketjourney.com/downloads/pj/tutorials/audio.mp3 ”替换audioFileURL,它就可以正常工作。 是 Parse.com URL 破坏了它。这是 logcat 错误:
08-05 01:15:12.620: E/WVMExtractor(55): Failed to open libwvm.so
08-05 01:15:12.620: E/MediaPlayer(875): error (1, -2147483648)
这很难调试,因为显然它对应于这个无用的错误:MediaPlayer.MEDIA_ERROR_UNKNOWN。 (根据这个问题Android MediaPlayer error (1, -2147483648))
如有任何建议,我们将不胜感激!谢谢
最佳答案
我改变了从录音中获取字节数据的方式。这是我使用的代码:
File file = new File(mFileName);
byte[] byteArray = new byte[(int) file.length()];
try {
FileInputStream fileInputStream = new FileInputStream(file);
fileInputStream.read(byteArray);
for (int i = 0; i < byteArray.length; i++) {
System.out.print((char)byteArray[i]);
}
} catch (FileNotFoundException e) {
System.out.println("File Not Found.");
e.printStackTrace();
}
catch (IOException e1) {
System.out.println("Error Reading The File.");
e1.printStackTrace();
}
我最终还将我的文件录制为 .mp4 执行此操作需要对我的代码进行以下更改:
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
我还必须将文件扩展名更改为 .mp4 而不是 .3gpp
现在可以用了,但是声音有点糟糕
关于java - 通过 Android 应用程序将音频文件上传到 Parse.com 时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25131656/