[問題] Buffer沒有辦法儲存Audio data
各位板上先進
我想要在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
討論串 (同標題文章)
MacDev 近期熱門文章
PTT數位生活區 即時熱門文章