Запись аудио с помощью Kinect

Я попытался настроить этот образец записи Wav: http://channel9.msdn.com/Series/KinectQuickstart/Audio-Fundamentals

К новому SDK (Ver 1.6) и по какой-то причине результирующий файл .wav недействителен

В Инициативе:

        this.audioStream = this.sensor.AudioSource.Start();

        // Use a separate thread for capturing audio because audio stream read operations
        // will block, and we don't want to block main UI thread.
        this.readingThread = new Thread(AudioReadingThread);
        this.readingThread.Start();
        fileStream = new FileStream(@"d:\temp\temp.wav", FileMode.Create);

        int rec_time = (int) 20 * 2 * 16000;//20 sec
        WriteWavHeader(fileStream, rec_time);

Нить:

    private void AudioReadingThread()
    {

        while (this.reading)
        {
                int readCount = audioStream.Read(audioBuffer, 0, audioBuffer.Length);

                fileStream.Write(audioBuffer, 0, readCount);
        }
    }

WAV-заголовок:

    static void WriteWavHeader(Stream stream, int dataLength)
    {
        //We need to use a memory stream because the BinaryWriter will close the underlying stream when it is closed
        using (var memStream = new MemoryStream(64))
        {
            int cbFormat = 18; //sizeof(WAVEFORMATEX)
            WAVEFORMATEX format = new WAVEFORMATEX()
            {
                wFormatTag = 1,
                nChannels = 1,
                nSamplesPerSec = 16000,
                nAvgBytesPerSec = 32000,
                nBlockAlign = 2,
                wBitsPerSample = 16,
                cbSize = 0
            };

            using (var bw = new BinaryWriter(memStream))
            {
                bw.Write(dataLength + cbFormat + 4); //File size - 8
                bw.Write(cbFormat);

                //WAVEFORMATEX
                bw.Write(format.wFormatTag);
                bw.Write(format.nChannels);
                bw.Write(format.nSamplesPerSec);
                bw.Write(format.nAvgBytesPerSec);
                bw.Write(format.nBlockAlign);
                bw.Write(format.wBitsPerSample);
                bw.Write(format.cbSize);

                //data header
                bw.Write(dataLength);
                memStream.WriteTo(stream);
            }
        }
    }

person Uri Goren    schedule 07.01.2013    source источник
comment
Действительно ли this.audioStream в остальном? Как вы настраиваете свой датчик?   -  person Nicholas Pappas    schedule 08.01.2013
comment
Код работает без исключений, датчик установлен, wav файл не пустой. Просто формат наверное кривоват   -  person Uri Goren    schedule 08.01.2013
comment
Вы можете отправить мне полученный файл? У меня возникли проблемы с настройкой этого кода для запуска при попытке достичь той же цели. Из каких пространств имен берутся классы WAVEFORMATEX и WriteString? Где именно я помещаю заголовок риффа и модифицирую memstream в заголовке данных в вашем коде?   -  person Ivan    schedule 01.12.2013


Ответы (1)


Вы забыли добавить код для добавления «заголовка RIFF» в файл. Код такой же простой, как:

//RIFF header
WriteString(memStream, "RIFF");
bw.Write(dataLength + cbFormat + 4); //File size - 8
WriteString(memStream, "WAVE");
WriteString(memStream, "fmt ");
bw.Write(cbFormat);

Вы также забыли изменить memStream в «заголовке данных», вам нужна строка:

WriteString(memStream, "data");
person Kinected    schedule 08.01.2013