2016-02-17 37 views
4

之前已經提到過這個問題,但是自問題出現以來,Swift肯定發生了一些變化。我試圖存儲CMSampleBufferAVCaptureSession返回的對象稍後處理。經過一些實驗後,我發現AVCaptureSession必須重用其參考文獻CMSampleBuffer。當我試圖保持超過15個會話掛起。所以我想我會製作樣本緩衝區的副本。但我似乎無法讓它工作。這裏是我寫的:在Swift 2.0中創建一個CMSampleBuffer的副本

var allocator: Unmanaged<CFAllocator>! = CFAllocatorGetDefault() 
var bufferCopy: UnsafeMutablePointer<CMSampleBuffer?> 
let err = CMSampleBufferCreateCopy(allocator.takeRetainedValue(), sampleBuffer, bufferCopy) 
if err == noErr { 
    bufferArray.append(bufferCopy.memory!) 
} else { 
    NSLog("Failed to copy buffer. Error: \(err)") 
} 

這將不會編譯,因爲它說Variable 'bufferCopy' used before being initialized。我看了很多例子,他們會編譯或不工作,否則他們不會編譯。

有人看到我在這裏做錯了嗎?

回答

1

從字面上看,您正嘗試在初始化之前使用變量bufferCopy。

你已經爲它聲明瞭一個類型,但還沒有分配它指向的內存。

你應該使用下面的調用https://developer.apple.com/library/tvos/documentation/CoreMedia/Reference/CMSampleBuffer/index.html#//apple_ref/c/func/CMSampleBufferCreate

你應該能夠緩衝複製到此然後而是創建CMSampleBuffers(只要緩衝區的格式相匹配你從複製一個)。

+1

感謝您的響應添,這似乎是它可以是一個很好的解決方案,以深入克隆。但我並不熟悉在這個級別使用內存的方式。你知道我在哪裏可以找到一個體面的例子,說明如何爲視頻和音頻創建一個'CMSampleBuffer'深層克隆? Apple顯然擁有一個15'CMSampleBuffer'的緩存,可以在運行'AVCaptureSession'時回收它。我顯然需要深入克隆來存儲我自己的。 – Rob

+1

我終於想出瞭如何使用它來創建一個深層克隆。所有的複製方法都會重用堆中保存的數據來鎖定'AVCaptureSession'。所以我不得不將數據拉出到一個「NSMutableData」對象中,然後創建一個新的樣本緩衝區。謝謝 – Rob

+0

@Rob你可以添加你的代碼來進行深度克隆。我有同樣的問題,並且已經搜索了半天。 – ferdyyy

5

可以簡單地傳遞一個CMSampleBuffer?變量(其作爲任選, 隱含地與nil初始化)作爲INOUT參數與 &

var bufferCopy : CMSampleBuffer? 
let err = CMSampleBufferCreateCopy(kCFAllocatorDefault, buffer, &bufferCopy) 
if err == noErr { 
    // ... 
} 
+2

謝謝。這回答了我上面得到代碼編譯的問題。當我測試運行代碼時,事實證明它一定是一個淺層克隆。新的'CMSampleBuffer'所保存的數據與前一個位置相同。所以當我運行'AVCaptureSession'時,它發送了15個樣本並再次被鎖定,因爲我持有對基礎數據位置的引用。任何想法如何創建一個深層克隆,以便我可以將數據複製到內存中的新位置?謝謝! – Rob