【问题标题】:audio Streaming AVFoundation using Audio Queues/ buffer in iOS在 iOS 中使用音频队列/缓冲区的音频流 AVFoundation
【发布时间】:2018-01-30 06:32:27
【问题描述】:

我需要使用 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);
}

【问题讨论】:

    标签: ios objective-c avfoundation


    【解决方案1】:

    我发布了一个示例代码,您需要完成这项工作。它的方法与您的方法几乎相同。您应该能够轻松阅读。

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

    您可以在以下网址下载源代码:

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-07-31
      • 1970-01-01
      • 2011-06-01
      • 2018-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多