使用JSON从Android应用程序发送/接收.wav文件到Django服务器

时间:2015-10-31 21:25:59

标签: android python json django audio

我正在尝试将我的Android应用程序中的.wav文件发送到Django服务器。主要问题是在服务器端经常出现此错误: wave.Error:文件不以RIFF id开头

从客户端的角度来看,这是我将 test_audio.wav 文件转换为 byte []

的方式
HashMap<String, String> postParams = new HashMap<>();

InputStream inStream = testPronunciationView.getContext().getResources().openRawResource(R.raw.test_audio);
ByteArrayOutputStream out = new ByteArrayOutputStream();
BufferedInputStream in = new BufferedInputStream(inStream);

int read;
byte[] buff = new byte[1024];
while ((read = in.read(buff)) > 0) {
    out.write(buff, 0, read);
}
out.flush();
byte[] fileAudioByte = out.toByteArray();

// two options to transform in a string
// 1st option
String decoded = new String(fileAudioByte, "UTF-8");
// 2nd option
String decoded = toJSON(fileAudioByte);

// decoded = either one of above
postDataParams.put("Audio", decoded)

// ....
// prepare a POST request here to send to the server

HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(15000);
conn.setConnectTimeout(15000);
conn.setRequestMethod("POST");
conn.setDoInput(true);
conn.setDoOutput(true);

OutputStream os = conn.getOutputStream();
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, "UTF-8"));
writer.write(getPostDataString(postDataParams));
writer.flush();
writer.close();
os.close();

编辑:创建JSON字符串的方法:

public static String toJSON(Object object) throws JSONException, IllegalAccessException
{
    String str = "";
    Class c = object.getClass();
    JSONObject jsonObject = new JSONObject();
    for (Field field : c.getDeclaredFields()) {
        field.setAccessible(true);
        String name = field.getName();
        String value = String.valueOf(field.get(object));
        jsonObject.put(name, value);
    }
    System.out.println(jsonObject.toString());
    return jsonObject.toString();
}

在服务器端我做:

audiofile_string = data['FileAudio']

audiofile_byte = list(bytearray(audiofile_string, 'utf8'))
temp_audiofile = tempfile.NamedTemporaryFile(suffix='.wav')
with open(temp_audiofile.name, 'wb') as output:
     output.write(''.join(str(v) for v in audiofile_byte))

# The following line throws the error
f = wave.open(temp_audiofile.name, 'r') # wave.py library

所以我认为我在转换或后调用中做错了。有什么建议吗?感谢

1 个答案:

答案 0 :(得分:0)

您是否有使用JSON尝试执行此操作的具体原因?您不能只将二进制数据填充到JSON字符串中。

如果您可以避免使用JSON,那么只需使用multipart / form-data请求通过HTTP发布二进制数据。

如果由于某种原因您仍然坚持使用JSON,则可以使用base64编码来实现此目的。在Android应用中,您需要对二进制数据进行base64编码。这将产生一个字符串。然后,您可以将JSON中的此字符串发送到服务器。在服务器端,您需要从JSON,base64解码中获取此base64编码的字符串,然后将其保存到文件(或者您想要对二进制数据执行的任何操作)。这是一些小例子。

客户方:

int read;
byte[] buff = new byte[1024];
while ((read = in.read(buff)) > 0) {
    out.write(buff, 0, read);
}
out.flush();
byte[] fileAudioByte = out.toByteArray();

String encodedString = Base64.encodeToString(fileAudioByte, Base64.DEFAULT);

encodedStringString,然后您将添加到您的JSON以发送到服务器。

服务器端:

import base64
...
audiofile_string = data['FileAudio']
audiofile_byte= base64.b64decode(audiofile_string)
# audiofile_byte now contains the bytes of the audio file, proceed to write to disk