base64编码音频文件并作为String发送然后解码字符串

时间:2011-06-23 03:00:03

标签: java android

我已经坚持这个问题几个小时了,现在试图让它运转起来。基本上我要做的是以下内容。 Base64编码从Android设备上的SD卡中拾取的音频文件,Base64对其进行编码,将其转换为字符串,然后再次使用Base64解码字符串并将文件保存回sdcard。听起来相当简单,使用文本文件时效果很好。例如,如果我创建一个简单的文本文件,调用它dave.text并注入一些文本,说“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(decodingBytes)保存decodeBytes,它可以工作但不能在转换为String时使用getBytes()。

有什么想法吗?谢谢!

2 个答案:

答案 0 :(得分:18)

你混淆了Stringbyte[] s。不要那样做。如果您要将byte[]编码为String,请使用Base64.encodeToString(),而不是编码为字节,然后创建字符串。

  

如果我尝试使用os.write(decodingBytes)保存decodeBytes,它可以工作但不能转换为String并且使用了getBytes()。

调用new String(byte[])并不符合您的预期。

同样使用Base64.decode(String, int)解码字符串。

像这样(未经测试):

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编码?

答案 1 :(得分:0)

将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();
}