байтовый массив звуковых данных из Windows Phone 7 в App Engine - PullRequest
1 голос
/ 24 апреля 2011

Я пытаюсь отправить байты звуковых данных из Windows Phone 7 в Java-сервлет App Engine. Где-то по пути данные облажались, и когда я пытаюсь воспроизвести звук, это не работает. Вот часть кода:

WP7:

public static void SendEmail(byte[] data, String to, String subject, String filename)
    {
        //WebClient wc = new WebClient();
        //wc.Headers[HttpRequestHeader.ContentType] = "application/binary";
        String url = "http://someserver/test?to=" + to + "&subject=" + subject + "&filename=" + filename;
        //wc.OpenReadAsync(new Uri(url), "POST");

        var webClient = new WebClient();
        webClient.OpenWriteAsync(new Uri(url), "POST", data);
        webClient.OpenWriteCompleted += new OpenWriteCompletedEventHandler(webClient_OpenWriteCompleted);
    }

    static void webClient_OpenWriteCompleted(object sender, OpenWriteCompletedEventArgs e)
    {
        object[] objArr = e.UserState as object[];
        byte[] fileContent = e.UserState as byte[];

        Stream outputStream = e.Result;
        outputStream.Write(fileContent, 0, fileContent.Length);
        outputStream.Flush();
        outputStream.Close();
    }

Сервлет App Engine:

InputStream in = req.getInputStream();
ByteArrayOutputStream bos = new ByteArrayOutputStream();
int next = in.read();
while (next > -1) {
  bos.write(next);
  next = in.read();
}       
bos.flush();
attachmentData = bos.toByteArray();

Wp7 аудио код:

microphone.GetData(buffer);

stream.Write(buffer, 0, buffer.Length);
//then I save the stream.toArray() to an object and use it later for playback on the   phone

Java-код для создания аудио (аудио отправляется в виде вложения в электронное письмо):

MimeBodyPart attachmentPart = new MimeBodyPart();
        attachmentPart.setFileName(filename + ".wav");
        attachmentPart.setDisposition(Part.ATTACHMENT);
        DataSource src = new ByteArrayDataSource(attachmentData, "audio/x-wav");
        DataHandler handler = new DataHandler(src);
        attachmentPart.setDataHandler(handler);
        mp.addBodyPart(attachmentPart);

Ответы [ 2 ]

2 голосов
/ 24 апреля 2011

Вам нужно знать о вашей порядковой численности .Я не очень много знаю о Google App Engine, но думаю, что ваш сервлет - это код Java, а код Windows Phone 7 - это C #?Поскольку вы читаете целые числа (4 байта) в сервлете движка приложения и пишете байты на стороне WP7, я думаю, что вы пишете байты в одном порядке байтов и читаете в другом.Если это так, вам придется либо изменить порядок байтов при записи байтов на стороне WP7 (есть ли в WP7 класс BitConverter?), Либо «переключать» байты на другой стороне, чтобы обеспечить правильную последовательность.

Кроме того, как пояснение, что вы подразумеваете под "не работает"?Он воспроизводит звук, который только что искажен?Или молчит?И т.д.

Один шаг для отладки порядка байтов - написать одно целое число (в форме байтов) на стороне WP7 и прочитать это целое число на стороне App Engine.Это одно и то же целое число?Если нет, то у вас проблема с порядком байтов.

0 голосов
/ 10 августа 2011

Вы добавили заголовок волны в свой файл? Необработанные байты с микрофона сами по себе не являются волновым файлом. Вы должны добавить правильный заголовок RIFF, который помимо прочего содержит информацию о количестве каналов, байтах на выборку, частоте дискретизации, кодировании и некоторых других битах. Я разместил статью на CodeProject.com, которая содержит код, который вам нужен. Это в диктофоне. Также проверьте область комментариев, поскольку там есть ссылка на потоковый рекордер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...