2016-02-17 3 views
1

Dans mon application, je dois capturer le microphone et envoyer des données audio dans le paquet rtp. Mais je ne vois que recevoir des données rtp comme iOS RTP live audio receiving ou sans réponse one.Objectif c: Envoyer des données audio dans un paquet rtp via le socket

J'ai utilisé le code suivant avec AsuncUdpSocket pour envoyer des données audio mais il n'était pas en boucle dans le paquet rtp. Y at-il une bibliothèque pour envelopper mes données audio dans le paquet rtp?

AsyncUdpSocket initial:

udpSender = [[GCDAsyncUdpSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()]; 

NSError *error; 
[udpSender connectToHost:@"192.168.1.29" onPort:1024 error:&error]; 

j'envoyer des données audio dans ma fonction de rappel de lecture:

static OSStatus playbackCallback(void *inRefCon, 
          AudioUnitRenderActionFlags *ioActionFlags, 
          const AudioTimeStamp *inTimeStamp, 
          UInt32 inBusNumber, 
          UInt32 inNumberFrames, 
          AudioBufferList *ioData) {  

/** 
This is the reference to the object who owns the callback. 
*/ 
AudioProcessor *audioProcessor = (AudioProcessor*) inRefCon; 

// iterate over incoming stream an copy to output stream 
for (int i=0; i < ioData->mNumberBuffers; i++) { 
    AudioBuffer buffer = ioData->mBuffers[i]; 

    // find minimum size 
    UInt32 size = min(buffer.mDataByteSize, [audioProcessor audioBuffer].mDataByteSize); 

    // copy buffer to audio buffer which gets played after function return 
    memcpy(buffer.mData, [audioProcessor audioBuffer].mData, size); 

    // set data size 
    buffer.mDataByteSize = size; 

    //Send data to remote server  

    NSMutableData *data=[[NSMutableData alloc] init]; 
    Float32 *frame = (Float32*)buffer.mData; 
    [data appendBytes:frame length:size]; 
    if ([udpSender isConnected]) 
    { 
     [udpSender sendData:data withTimeout:-1 tag:1]; 
    } 


} 



return noErr; 
} 

Comment y parvenir?

Merci.

Répondre

2

Enfin, voici ma solution.

Configuration du processus de capture du microphone:

-(void)open { 
NSError *error; 
m_capture = [[AVCaptureSession alloc]init]; 
AVCaptureDevice *audioDev = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio]; 
if (audioDev == nil) 
{ 
    printf("Couldn't create audio capture device"); 
    return ; 
} 
//m_capture.sessionPreset = AVCaptureSessionPresetLow; 

// create mic device 
AVCaptureDeviceInput *audioIn = [AVCaptureDeviceInput deviceInputWithDevice:audioDev error:&error]; 
if (error != nil) 
{ 
    printf("Couldn't create audio input"); 
    return ; 
} 


// add mic device in capture object 
if ([m_capture canAddInput:audioIn] == NO) 
{ 
    printf("Couldn't add audio input"); 
    return ; 
} 
[m_capture addInput:audioIn]; 
// export audio data 
AVCaptureAudioDataOutput *audioOutput = [[AVCaptureAudioDataOutput alloc] init]; 
[audioOutput setSampleBufferDelegate:self queue:dispatch_get_main_queue()]; 
if ([m_capture canAddOutput:audioOutput] == NO) 
{ 
    printf("Couldn't add audio output"); 
    return ; 
} 


[m_capture addOutput:audioOutput]; 
[audioOutput connectionWithMediaType:AVMediaTypeAudio]; 
[m_capture startRunning]; 
return ; 
} 

capture les données du microphone:

-(void) captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection{ 
char szBuf[450]; 
int nSize = sizeof(szBuf); 

if (isConnect == YES) 
{ 
if ([self encoderAAC:sampleBuffer aacData:szBuf aacLen:&nSize] == YES) 
{ 
    [self sendAudioData:szBuf len:nSize channel:0]; 
} 

} 

Initial la prise

-(void)initialSocket{ 
    //Use socket 
    printf("initialSocket\n"); 
    CFReadStreamRef readStream = NULL; 
    CFWriteStreamRef writeStream = NULL; 

    NSString *ip = @"192.168.1.147"; //Your IP Address 
    uint *port = 22133; 

    CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, (__bridge CFStringRef)ip, port, &readStream, &writeStream); 
    if (readStream && writeStream) { 
    CFReadStreamSetProperty(readStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue); 
    CFWriteStreamSetProperty(writeStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue); 

    iStream = (__bridge NSInputStream *)readStream; 
    [iStream setDelegate:self]; 
    [iStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
    [iStream open]; 

    oStream = (__bridge NSOutputStream *)writeStream; 
    [oStream setDelegate:self]; 
    [oStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
    [oStream open]; 
    } 
} 

Envoyer des données à la prise lors de la capture du microphone sous forme de données.

-(void)sendAudioData: (char *)buffer len:(int)len channel:(UInt32)channel 
{ 
    Float32 *frame = (Float32*)buffer; 
    [globalData appendBytes:frame length:len]; 

    if (isConnect == YES) 
    { 
     if ([oStream streamStatus] == NSStreamStatusOpen) 
     { 
      [oStream write:globalData.mutableBytes maxLength:globalData.length]; 


      globalData = [[NSMutableData alloc] init]; 

     } 
    } 

} 

Espérons que cela aidera quelqu'un.

+0

Si je ne me trompe pas, ici vous n'emballez pas les données comme RTP. Ou êtes-vous faire la même chose dans l'une des méthodes? S'il vous plaît aidez-moi ici, je suis dans le besoin de la solution que je suis coincé – infiniteLoop

+0

@Wei Wen Hsiao: Hey cher. J'ai lu votre question. J'ai la même exigence. S'il vous plaît donner quelques suggestions pour la façon de créer un paquet RTP pour le streaming audio. – Wos