Создание CMSampleBufferRef из данных - PullRequest
8 голосов
/ 24 сентября 2010

Я пытаюсь создать CMSampleBuffer Ref из данных и пытаюсь передать его в AVAssetWriter. Но автор активов не может создать фильм из данных. Ниже приведен код для создания CMSampleBufferRef.

CVImageBufferRef cvimgRef = CMSampleBufferGetImageBuffer(sampleBuffer);
CVPixelBufferLockBaseAddress(cvimgRef,0);

uint8_t *buf=(uint8_t *)CVPixelBufferGetBaseAddress(cvimgRef);

int width = 480;
int height = 360;
int bitmapBytesPerRow   = width*4;
int bitmapByteCount     = bitmapBytesPerRow*height;


CVPixelBufferRef pixelBufRef = NULL;
CMSampleBufferRef newSampleBuffer = NULL;
CMSampleTimingInfo timimgInfo = kCMTimingInfoInvalid;
CMSampleBufferGetSampleTimingInfo(sampleBuffer, 0, &timimgInfo);

OSStatus result = 0;

OSType pixFmt = CVPixelBufferGetPixelFormatType(cvimgRef);

CVPixelBufferCreateWithBytes(kCFAllocatorDefault, width, height, pixFmt, buf, bitmapBytesPerRow, NULL, NULL, NULL, &pixelBufRef);

CMVideoFormatDescriptionRef videoInfo = NULL;

result = CMVideoFormatDescriptionCreateForImageBuffer(NULL, pixelBufRef, &videoInfo);

CMSampleBufferCreateForImageBuffer(kCFAllocatorDefault, pixelBufRef, true, NULL, NULL, videoInfo, &timimgInfo, &newSampleBuffer);

Создание фильма работает нормально, когда мы используем оригинальный CMSampleBufferRef, полученный из метода обратного вызова вывода данных AVFoundation.

Но то же самое не удается, когда я пытаюсь создать фильм с помощью пользовательского CMSampleBufferRef. Средство записи активов выдает следующую ошибку:

The operation couldn’t be completed. (AVFoundationErrorDomain error -11800.)

Пожалуйста, помогите мне решить эту проблему.

Ответы [ 2 ]

4 голосов
/ 03 октября 2010

Вы должны заглянуть в AVAssetWriterInputPixelBufferAdaptor - он принимает CVPixelBuffers, поэтому вам не нужно конвертировать CVPixelBuffer в CMSampleBuffer.

здесь есть ссылка на ветку об этом на форуме Apple Dev -> https://devforums.apple.com/thread/70258?tstart=0

Также - любой шанс, что вы сможете опубликовать файл своего проекта или пример кода работающего захвата фильма - я использую CMSampleBuffer по умолчанию из метода обратного вызова вывода данных AVFoundation - но когда я сохраняю его в камеру, катите еговсе черное, кроме последних 5 кадров, которые я должен вручную вычистить: S

любая помощь в отношении моей проблемы будет принята с благодарностью.

Приветствия,

Майкл

1 голос
/ 19 апреля 2014
    The operation couldn’t be completed. (AVFoundationErrorDomain error -11800.)

Для этой ошибки она всегда возникает, когда timingInfo недействительно. для этого нужно установить допустимые значения с PTS и Duration.

CMSampleTimingInfo timingInfo = kCMTimingInfoInvalid;
timingInfo.presentationTimeStamp = pts; 
timingInfo.duration = duration;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...