[問題] Buffer沒有辦法儲存Audio data

看板MacDev作者 (暑假閒閒的大學生~~)時間14年前 (2010/10/13 19:53), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/5 (看更多)
各位板上先進 我想要在iSight streaming的時候 同時截取frames及audio data 目前遇到的情況是 當我已經可以動態擷取到audio data的時候(可以讀到在串流時的所有資料) 我想利用一個buttom 擷取一組audio data到某一個buffer中 不過現在的問題就是 在動態擷取時mCurrentBuffer都會有值(length,duration...等等) 但是在按下capture鍵後 再取出來的值就都是0了 我很納悶為什麼不能保留 以下是動態擷取vidoe跟audio的程式碼: // Video部分 QTCaptureDecompressedVideoOutput 的delegate method - (void)captureOutput:(QTCaptureOutput *)captureOutputdidOutputVideo Frame:(CVImageBufferRef)videoFramewithSampleBuffer:(QTSampleBuffer *) sampleBufferfromConnection:(QTCaptureConnection *)connection { CVImageBufferRef imageBufferToRelease; CVBufferRetain(videoFrame); @synchronized (self) { imageBufferToRelease = mCurrentImageBuffer; mCurrentImageBuffer = videoFrame; //把目前的Frame放到buffer中 } if (mCurrentImageBuffer) { NSLog(@"Get Image Data !"); NSLog(@"%p",mCurrentImageBuffer); } CVBufferRelease(imageBufferToRelease); } // Audio部分 QTCaptureDecompressedAudioOutput 的delegate method -(void)captureOutput:(QTCaptureOutput *)captureOutputdidOutputAudio SampleBuffer:(QTSampleBuffer *)sampleBufferfromConnection:(QTCapture Connection *)connection { QTSampleBuffer *audioBufferRelese = nil; [sampleBuffer retain]; @synchronized (self) { audioBufferRelese = mCurrentAudioBuffer; mCurrentAudioBuffer = sampleBuffer; //把目前的audio data放到buffer } if (mCurrentAudioBuffer) { NSLog(@"Get Audio Data !"); NSLog(@"%i",[mCurrentAudioBuffer duration]); //這邊可以抓到值 } [audioBufferRelese release]; } 接下來是擷取單一畫面及單一audio data的程式碼: // 按下addFrame後 可以存入一張點陣圖 - (IBAction)addFrame:(id)sender { CVImageBufferRef imageBuffer; @synchronized (self) //把frame放進buffer { imageBuffer = CVBufferRetain(mCurrentImageBuffer); } if (imageBuffer) { // Create an NSImage and add it to the movie NSCIImageRep *imageRep = [NSCIImageRep imageRepWithCIImage:[CIImage imageWithCVImageBuffer:imageBuffer]]; NSImage *image = [[[NSImage alloc] initWithSize:[imageRep size]] autorelease]; [image addRepresentation:imageRep]; //加入imageRep的內容到image中 CVBufferRelease(imageBuffer); //釋放buffer //將image轉成bitmap檔格式(因為bitmap是未經壓縮過的圖片檔,只是多了檔頭 NSBitmapImageRep *bitMapImageRep = [[NSBitmapImageRep alloc] initWithData:[image TIFFRepresentation]]; [image addRepresentation:bitMapImageRep]; //把TIFF加到image中 NSData *mData = [bitMapImageRep representationUsingType:NSBMPFile Typeproperties:nil]; [mData writeToFile:@"/Users/Shared/test.bmp" atomically:NO]; } **********最重要的就是以下這一段 因為這一段不能work******** // 按下capture時 要擷取一份audio data - (IBAction)capture:(id)sender { QTSampleBuffer *audioBuffer = nil; @synchronized (self) { audioBuffer = [mCurrentAudioBuffer retain]; } if (audioBuffer) //有收到audio data就會進入 { NSLog(@"Capture Audio Raw Data !"); NSLog(@"%i",[audioBuffer duration]); } [audioBuffer release]; } 基本上video跟audio的方發都差不多 只差在用的brffer不同 在addFrame時CVImageBuffer能夠明確將資料留住 到了capture時 QTSampleBuffer就沒有辦法再event發生時留住裡面的資料 所以當動態擷取audio在跑的時候 按下capture時 就不會的得到正確的512 而是得到0 不知道是不是buffer的方式用錯 我這幾天找了很多的buffer都沒辦法合用 不知道是甚麼原因造成這樣的結果 希望版上的先進能夠幫幫我 感謝!! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.219.177.46
文章代碼(AID): #1CjPt9eK (MacDev)
文章代碼(AID): #1CjPt9eK (MacDev)