-2

我想在另一部 iPhone 上录制音频和流媒体。这种格式对于录制和流式传输是否正确?

format -> mSampleRate = 44100.00; //
    format -> mFormatID = kAudioFormatLinearPCM; //
    format -> mFramesPerPacket = 1;
    format -> mChannelsPerFrame = 1; //
    format -> mBitsPerChannel = 16; //
    format -> mReserved = 0;
    format -> mBytesPerPacket = 2;
    format -> mBytesPerFrame = 2;
    format -> mFormatFlags =  kLinearPCMFormatFlagIsSignedInteger | kLinearPCMFormatFlagIsPacked;

要求开始录音:

- (void) startRecordingInQueue {
    [self setupAudioFormat:&recordState.dataFormat];

    recordState.currentPacket = 0;

    OSStatus status;

    status = AudioQueueNewInput(&recordState.dataFormat, AudioInputCallback, &recordState, CFRunLoopGetCurrent(),kCFRunLoopCommonModes, 0, &recordState.queue);



    status = 0;
    if(status == 0) {
        //Prime recording buffers with empty data
        AudioQueueBufferRef buffer;
        for (int i=0; i < NUM_BUFFERS; i++) {


            AudioQueueAllocateBuffer(recordState.queue, SAMPLERATE, &recordState.buffers[i]);
            AudioQueueEnqueueBuffer(recordState.queue, recordState.buffers[i], 0, NULL);

        }

        status = AudioFileCreateWithURL(fileURL, kAudioFileAIFFType, &recordState.dataFormat, kAudioFileFlags_EraseFile, &recordState.audioFile);


        NSLog(@"ss %i",status);
        status = 0;
        if (status == 0) {
            recordState.recording = true;
            status = AudioQueueStart(recordState.queue, NULL);

            if(status == 0) {
                NSLog(@"-----------Recording--------------");
                NSLog(@"File URL : %@", fileURL);
                NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@",fileURL] relativeToURL:NULL];
                [[NSUserDefaults standardUserDefaults] setURL:url forKey:@"fileUrl"];
                [[NSUserDefaults standardUserDefaults] synchronize];
            }
        }
    }

    if (status != 0) {
        [self stopRecordingInQueue];
    }
}

如果可以的话

如何在这段代码中取出音频缓冲区数据以发送到服务器?以及如何在其他设备上播放其数据?

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");
    }

    printf("Writing buffer %lld\n", recordState->currentPacket);
    OSStatus status = AudioFileWritePackets(recordState->audioFile,
                                            false,
                                            inBuffer->mAudioDataByteSize,
                                            inPacketDescs,
                                            recordState->currentPacket,
                                            &inNumberPacketDescriptions,
                                            inBuffer->mAudioData);




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


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


    }
}

如果有人有这个项目的完整代码,请将我链接到源代码。谢谢

4

1 回答 1

0

这是我的代码之一,您尝试更改格式

在发送到服务器之后,我在这里停止了录音。这是我的要求。为此,我将音频文件转换为 .wav。发送到服务器后也播放成功。试试看...

- (IBAction)stop:(id)sender { // On tap stop button

NSString *urlString;

NSLog(@"Stop Recording");
if ([audioRecorder isRecording]) // If recording audio 
{
    [audioRecorder stop]; //Stop it 
    AVAudioSession *audioSession = [AVAudioSession sharedInstance];
    [audioSession setCategory:AVAudioSessionCategoryPlayback error:nil];
    [audioSession setActive:NO error:nil];

    NSLog(@"%@", audioRecorder.url); 

    unsigned long long size = [[NSFileManager defaultManager] attributesOfItemAtPath:[audioRecorder.url path] error:nil].fileSize;//Get audio file path
    NSLog(@"This is the file size of the recording in bytes: %llu", size); // Audio file size in bytes

这里我的文件保存在文件目录中,文件名为“Audio”。所以没有获取该文件,我将文件名更改为 56e254fa816e8_1519650589.wav 并将该文件发送到服务器。

    self.sendFileName = [@"56e254fa816e8" stringByAppendingString:@"_"];
    self.sendFileName = [self.sendFileName stringByAppendingString:[@(self.unixTimeStamp) stringValue]];
    self.sendFileName = [self.sendFileName stringByAppendingString:@".wav"]; // Here name converted in to .wav completely

    NSLog(@"%@", self.sendFileName);//See here the file formate

    urlString = [audioRecorder.url.absoluteString stringByReplacingOccurrencesOfString:@"Audio" withString:self.sendFileName];

    self.sendingURL = [NSURL URLWithString:urlString];

    NSLog(@"%@", self.sendingURL);//Complete file url

}

}

尝试这个...

于 2018-02-26T13:14:08.123 回答