3

Здравствуйте, мне нужно отправить CMSampleBufferRef по сети. Затем клиент воспроизводит CMSampleBufferRef через Службы очереди аудио. Я видел несколько примеров переполнения стека, но большинство из них просто посылают буфер. Но тогда некоторые данные теряются. Я нашел, что [AVAssetReaderOutput copyNextSampleBuffer] возвращает ссылку на структуру opaqueCMSampleBuffer. Я знаю, как получить адрес памяти opaqueCMSampleBuffer, но как скопировать содержимое адреса в массив, чтобы я мог отправить его по сети? Или есть более элегантные подходы к отправке CMSampleBuffer по сети. Или я могу каким-то образом получить доступ к opaqueCMSampleBuffer?NSData или байты от CMSampleBufferRef

спасибо за ваше время и помочь

ответ

0

Вот как вы создаете объект NSData из CMSampleBufferRef:

  1. В интерфейсе (.h) файл, добавьте ссылку пример буфера в качестве свойства, литье на объект в то же самое время:

    @property (неатомической, сильный) _ _ атрибут _ _ ((NSObject)) CMSampleBufferRef sampleBuffer;

  2. В файле реализации (.m):

    CMSampleBufferRef sampleBuffer = (CMSampleBufferRef) [(AVAssetReaderTrackOutput *) [assetReader выходы] [0] copyNextSampleBuffer];

    NSPurgeableData * образецBufferData = (NSPurgeableData *) [сам изображениеToBuffer: образецBuffer];

Чтобы получить доступ к буферу выборки из объекта NSData, просто использовать бросок:

(CMSampleBufferRef)sampleBufferData; 

Вот еще один способ:

- (NSData *) imageToBuffer:(CMSampleBufferRef)source { 
    CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(source); 
    CVPixelBufferLockBaseAddress(imageBuffer,0); 

    size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer); 
    size_t width = CVPixelBufferGetWidth(imageBuffer); 
    size_t height = CVPixelBufferGetHeight(imageBuffer); 
    void *src_buff = CVPixelBufferGetBaseAddress(imageBuffer); 

    NSData *data = [NSData dataWithBytes:src_buff length:bytesPerRow * height]; 

    CVPixelBufferUnlockBaseAddress(imageBuffer, 0); 
    return data; 
} 
Смежные вопросы