Записать аудио на NSData - PullRequest
       34

Записать аудио на NSData

4 голосов
/ 13 декабря 2011

Я установил TCP-соединение между двумя iPhone и могу отправлять пакеты NSData между ними. Я хотел бы поговорить в микрофон, получить запись в виде объекта NSData и отправить ее на другой iPhone. Я успешно использовал Audio Queue Services для записи звука и его воспроизведения, но мне не удалось получить запись как NSData. Я опубликовал вопрос о преобразовании записи в NSData при использовании Audio Queue Services , но это не дало мне дальнейшего.

Поэтому я хотел бы услышать, есть ли какой-то другой способ, которым я могу воспользоваться, чтобы говорить в микрофон iPhone и получить ввод в виде необработанных данных?

Обновление:

Мне нужно отправлять пакеты непрерывно во время записи. Например. каждую секунду во время записи я буду отправлять данные, записанные в течение этой секунды.

Ответы [ 3 ]

5 голосов
/ 13 декабря 2011

Обе аудио-очереди и аудиоустройство RemoteIO обеспечат вам буферы необработанного звука в режиме реального времени с довольно низкой задержкой. Вы можете взять указатель буфера и длину байта, указанные в каждом звуковом обратном вызове, чтобы создать новый блок NSData. RemoteIO обеспечит минимальную задержку, но может потребовать передачи сетевых сообщений вне потока обратного вызова.

0 голосов
/ 09 сентября 2013

Это то, что я сделал на записывающем iphone:

void AudioInputCallback(void * inUserData,
                    AudioQueueRef inAQ,
                    AudioQueueBufferRef inBuffer,
                    const AudioTimeStamp * inStartTime,
                    UInt32 inNumberPacketDescriptions,
                    const AudioStreamPacketDescription * inPacketDescs)
{
RecordState * recordState = (RecordState*)inUserData;
if (!recordState->recording)
{
    printf("Not recording, returning\n");
}

// if (inNumberPacketDescriptions == 0 && recordState->dataFormat.mBytesPerPacket != 0)
// {
//     inNumberPacketDescriptions = inBuffer->mAudioDataByteSize / recordState->dataFormat.mBytesPerPacket;
// }

printf("Writing buffer %lld\n", recordState->currentPacket);

OSStatus status = AudioFileWritePackets(recordState->audioFile,
                                        false,
                                        inBuffer->mAudioDataByteSize,
                                        inPacketDescs,
                                        recordState->currentPacket,
                                        &inNumberPacketDescriptions,
                                        inBuffer->mAudioData);
NSLog(@"DATA = %@",[NSData dataWithBytes:inBuffer->mAudioData length:inBuffer->mAudioDataByteSize]);

[[NSNotificationCenter defaultCenter] postNotificationName:@"Recording" object:[NSData dataWithBytes:inBuffer->mAudioData length:inBuffer->mAudioDataByteSize]];

if (status == 0)
{
    recordState->currentPacket += inNumberPacketDescriptions;
}

AudioQueueEnqueueBuffer(recordState->queue, inBuffer, 0, NULL);
}

Я вызвал уведомление, которое помогает отправлять пакеты данных на другой iPhone в сети.

Но яне знаю, как читать данные на другой стороне.Я все еще пытаюсь понять, как это работает.Я обязательно обновлюсь, как только сделаю это.

0 голосов
/ 13 декабря 2011

Используя AVAudioRecorder, вот так:

NSURL *filePath = //Your desired path for the file
NSDictionary *settings; //The settings for the recorded file
NSError *error = nil;
AVAudioRecorder *recorder = [[AVAudioRecorder alloc] initWithURL:filePath settings:recordSetting error:&error];
....
[recorder record];
....
[recorder stop];
....

И получить NSData из файла:

NSData *audioData = [[NSData alloc] initWithContentsOfFile:filePath];

Ссылка AVAudioRecorder, здесь .

Edit:

Чтобы извлечь фрагменты записанного аудио, вы можете использовать метод subdataWithRange: в классе NSData. Сохраните смещение, из которого вы хотите получить байты. Вы можете запускать NSTimer каждую секунду, чтобы вы могли собирать байты и отправлять их. Вам нужно будет узнать, сколько байтов записывается каждую секунду.

...