gpt4 book ai didi

ios - 在 iOS 中使用音频队列/缓冲区的音频流 AVFoundation

转载 作者:行者123 更新时间:2023-11-29 00:18:10 24 4
gpt4 key购买 nike

我需要使用 Objective C 在 iOS 应用程序中进行音频流传输。我使用了 AVFoundation 框架并从麦克风捕获原始数据并发送到服务器。但是我收到的原始数据已损坏,下面是我的代码。

请指出我哪里做错了。

session = [[AVCaptureSession alloc] init];

NSDictionary *recordSettings = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithInt:kAudioFormatLinearPCM],AVFormatIDKey,
[NSNumber numberWithFloat:16000.0], AVSampleRateKey,
[NSNumber numberWithInt: 1],AVNumberOfChannelsKey,
[NSNumber numberWithInt:32], AVLinearPCMBitDepthKey,
[NSNumber numberWithBool:NO],AVLinearPCMIsBigEndianKey,
[NSNumber numberWithBool:NO], AVLinearPCMIsFloatKey,
[NSNumber numberWithBool:NO], AVLinearPCMIsNonInterleaved,
nil];


AVCaptureDevice *audioDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio];
AVCaptureDeviceInput *audioInput = [AVCaptureDeviceInput deviceInputWithDevice:audioDevice error:nil];
[session addInput:audioInput];

AVCaptureAudioDataOutput *audioDataOutput = [[AVCaptureAudioDataOutput alloc] init];
dispatch_queue_t audioQueue = dispatch_queue_create("AudioQueue", NULL);
[audioDataOutput setSampleBufferDelegate:self queue:audioQueue];

AVAssetWriterInput *_assetWriterVideoInput = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeAudio outputSettings:recordSettings];
_assetWriterVideoInput.performsMultiPassEncodingIfSupported = YES;

if([session canAddOutput:audioDataOutput] ){
[session addOutput:audioDataOutput];
}
[session startRunning];

捕获:

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection{
AudioBufferList audioBufferList;
NSMutableData *data= [NSMutableData data];
CMBlockBufferRef blockBuffer;
CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer(sampleBuffer, NULL, &audioBufferList, sizeof(audioBufferList), NULL, NULL, 0, &blockBuffer);

for( int y=0; y< audioBufferList.mNumberBuffers; y++ ){

AudioBuffer audioBuffer = audioBufferList.mBuffers[y];
Float32 *frame = (Float32*)audioBuffer.mData;
[data appendBytes:frame length:audioBuffer.mDataByteSize];

NSString *base64Encoded = [data base64EncodedStringWithOptions:0];
NSLog(@"Encoded: %@", base64Encoded);

}

CFRelease(blockBuffer);
}

最佳答案

我发布了完成此工作所需的代码示例。它的方法与你的几乎相同。您应该能够轻松阅读它。

该应用使用 AudioUnit 来录制和回放麦克风输入和扬声器输出,使用 NSNetServices 连接网络上的两个 iOS 设备,并使用 NSStreams 在设备之间发送音频流。

您可以在以下位置下载源代码:

https://drive.google.com/open?id=1tKgVl0X92SYvgpvbljRzilXNQ6iBcjqM

它需要最新的 Xcode 9 beta 版本才能编译,并需要最新的 iOS 11 beta 版本才能运行它。

注意|每个方法调用和事件的日志条目都显示在包含整个屏幕的文本字段中;没有交互界面,没有按钮等。在两台 iOS 设备上安装该应用程序后,只需在两台设备上启动它即可自动连接到您的网络并开始传输音频。

enter image description here

关于ios - 在 iOS 中使用音频队列/缓冲区的音频流 AVFoundation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44779268/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com