Próbuję utworzyć kopię CMSampleBuffer jako zwróconą przez captureOutput w AVCaptureAudioDataOutputSampleBufferDelegate
.Głęboka kopia audio CMSampleBuffer
Problem polega na tym, że moje klatki pochodzące z metody delegowania captureOutput:didOutputSampleBuffer:fromConnection:
są usuwane po tym, jak długo je przechowuję w CFArray
.
Oczywiście, potrzebuję utworzyć głębokie kopie buforów przychodzących do dalszego przetwarzania. Wiem też, że CMSampleBufferCreateCopy
tworzy tylko płytkie kopie.
Istnieje kilka Podobne pytania zadano na SO:
- Pulling data from a CMSampleBuffer in order to create a deep copy
- Creating copy of CMSampleBuffer in Swift returns OSStatus -12743 (Invalid Media Format)
- Deep Copy of CMImageBuffer or CVImageBuffer
Ale żaden z nich nie pozwala mi używać prawidłowo CMSampleBufferCreate funkcji z 12 parametrów:
CMSampleBufferRef copyBuffer;
CMBlockBufferRef data = CMSampleBufferGetDataBuffer(sampleBuffer);
CMFormatDescriptionRef formatDescription = CMSampleBufferGetFormatDescription(sampleBuffer);
CMItemCount itemCount = CMSampleBufferGetNumSamples(sampleBuffer);
CMTime duration = CMSampleBufferGetDuration(sampleBuffer);
CMTime presentationStamp = CMSampleBufferGetPresentationTimeStamp(sampleBuffer);
CMSampleTimingInfo timingInfo;
timingInfo.duration = duration;
timingInfo.presentationTimeStamp = presentationStamp;
timingInfo.decodeTimeStamp = CMSampleBufferGetDecodeTimeStamp(sampleBuffer);
size_t sampleSize = CMBlockBufferGetDataLength(data);
CMBlockBufferRef sampleData;
if (CMBlockBufferCopyDataBytes(data, 0, sampleSize, &sampleData) != kCMBlockBufferNoErr) {
VLog(@"error during copying sample buffer");
}
// Here I tried data and sampleData CMBlockBuffer instance, but no success
OSStatus status = CMSampleBufferCreate(kCFAllocatorDefault, data, isDataReady, nil, nil, formatDescription, itemCount, 1, &timingInfo, 1, &sampleSize, ©Buffer);
if (!self.sampleBufferArray) {
self.sampleBufferArray = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
//EXC_BAD_ACCESS crash when trying to add sampleBuffer to the array
CFArrayAppendValue(self.sampleBufferArray, copyBuffer);
} else {
CFArrayAppendValue(self.sampleBufferArray, copyBuffer);
}
W jaki sposób kopiować audio Audio CMS? Zachęcamy do używania dowolnego języka (szybkiego/obiektywnego-c) w swoich odpowiedziach.
Czy to oczywiste, że potrzebujesz głębokiej kopii? Co się dzieje, gdy używasz 'CMSampleBufferCreateCopy'? Czy "CMSampleBufferCopySampleBufferForRange" dałoby głęboką kopię? Czy naprawdę potrzebujesz "CMSampleBuffer" do dalszego przetwarzania? Jeśli robisz własne przetwarzanie, długość + wskaźnik może być wygodniejsza. –
@RhythmicFistman tak, oczywiste jest, że potrzebuję głębokiej kopii, jeśli użyję 'CMSampleBufferCreateCopy', a następnie zatrzymam skopiowaną próbkę w' CFArray' więcej niż 1s, 'didOutputSampleBuffer' przestanie być wywoływane. Możesz go łatwo odtworzyć za pomocą tego [pytania] (https://stackoverflow.com/questions/30850676/avcaptureoutput-didoutputsamplebuffer-stops-getting-called). Sprawdzę zachowanie za pomocą 'CMSampleBufferCopySampleBufferForRange' i zaktualizuję. –
Ach, ok, to, że buforowanie zatrzymujące blokuje połączenia od uczestników jest ważną informacją. Czy masz link do działającej wersji powyższego kodu? –