Java base64编码音频文件并作为字符串发送,然后解码该字符串
我已经在这个问题上纠缠了几个小时了,现在正努力让它工作。基本上我想做的是以下几点。Base64编码从Android设备上的SD卡上拾取的音频文件,Base64编码,将其转换为字符串,然后再次使用Base64解码字符串,并将文件保存回SD卡。这一切听起来相当简单,在使用文本文件时效果非常好。例如,如果我创建了一个简单的文本文件,将其命名为dave.text,并将一些文本插入到say“Hello dave”或类似的内容中,效果很好,但在本例中,当我尝试对二进制文件(音频)执行相同操作时失败。这是我正在使用的代码Java base64编码音频文件并作为字符串发送,然后解码该字符串,java,android,Java,Android,我已经在这个问题上纠缠了几个小时了,现在正努力让它工作。基本上我想做的是以下几点。Base64编码从Android设备上的SD卡上拾取的音频文件,Base64编码,将其转换为字符串,然后再次使用Base64解码字符串,并将文件保存回SD卡。这一切听起来相当简单,在使用文本文件时效果非常好。例如,如果我创建了一个简单的文本文件,将其命名为dave.text,并将一些文本插入到say“Hello dave”或类似的内容中,效果很好,但在本例中,当我尝试对二进制文件(音频)执行相同操作时失败。这是我正
File file = new File(Environment.getExternalStorageDirectory() + "/hello-4.wav");
byte[] FileBytes = FileUtils.readFileToByteArray(file);
byte[] encodedBytes = Base64.encode(FileBytes, 0);
String encodedString = new String(encodedBytes);
Utilities.log("~~~~~~~~ Encoded: ", new String(encodedString));
byte[] decodedBytes = Base64.decode(encodedString, 0);
String decodedString = new String(decodedBytes);
Utilities.log("~~~~~~~~ Decoded: ", new String(decodedString));
try {
File file2 = new File(Environment.getExternalStorageDirectory() + "/hello-5.wav");
FileOutputStream os = new FileOutputStream(file2, true);
os.write(decodedString.getBytes());
os.flush();
os.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
在这一点上,如果我试图保存文件,它就会损坏。音频文件hello-5.wav比原始文件大,无法播放
你知道我做错了什么吗?如果我尝试使用os.write(decodedBytes)保存decodedBytes,它会工作,但在转换为字符串并使用getBytes()时不会工作
有什么想法吗?谢谢大家! 您将
字符串
s和字节[]
s严重混合。不要那样做。如果要将字节[]
编码为字符串
,请使用,而不是编码为字节,然后创建字符串
如果我尝试使用os.write(decodedBytes)保存decodedBytes,它会工作,但在转换为字符串并使用getBytes()时不会工作
打电话并不是你想象的那样
同样,也可以使用来解码字符串
类似这样的内容(未测试):
File file = new File(Environment.getExternalStorageDirectory() + "/hello-4.wav");
byte[] bytes = FileUtils.readFileToByteArray(file);
String encoded = Base64.encodeToString(bytes, 0);
Utilities.log("~~~~~~~~ Encoded: ", encoded);
byte[] decoded = Base64.decode(encoded, 0);
Utilities.log("~~~~~~~~ Decoded: ", Arrays.toString(decoded));
try
{
File file2 = new File(Environment.getExternalStorageDirectory() + "/hello-5.wav");
FileOutputStream os = new FileOutputStream(file2, true);
os.write(decoded);
os.close();
}
catch (Exception e)
{
e.printStackTrace();
}
但是为什么要首先对音频文件进行base64编码?将base64字符串文件解码为.m4a文件格式
try
{
String audioDataString = "";
BufferedReader jsonReader = new BufferedReader(new InputStreamReader(this.getResources().openRawResource(R.raw.audioBase64File)));
StringBuilder jsonBuilder = new StringBuilder();
for (String line = null; (line = jsonReader.readLine()) != null; ) {
jsonBuilder.append(line).append("");
}
audioDataString = jsonBuilder.toString();
byte[] decoded = Base64.decode(audioDataString, Base64.DEFAULT);
try {
File file2 = new File(Environment.getExternalStorageDirectory() + "/faakhir_testAudio.m4a");
FileOutputStream os = new FileOutputStream(file2, true);
os.write(decoded);
os.close();
} catch (Exception e) {
e.printStackTrace();
}
} catch(Exception e){
e.printStackTrace();
}
谢谢你,马特,完美的解决方案。我相信这会帮助很多人!!嗨,马特,我也有同样的问题。你建议这是一种播放音频的书面方式。bcoz播放音频需要很长时间。首先,我读取加密文件,然后解密,再写回mp4文件格式。我想知道为什么您和op在输出流中使用“true”-
FileOutputStream(file2,true)
根据文档,这将从文件末尾开始编写,我想如果输出文件还不存在,或者是否存在,这并不重要?我认为在op的原始帖子中,这可能就是为什么他在least@Wraithious你必须问OP:我只是修改了现有的代码。