gpt4 book ai didi

objective-c - NSData 或来自 CMSampleBufferRef 的字节

转载 作者:行者123 更新时间:2023-12-01 19:06:03 27 4
gpt4 key购买 nike

您好,我需要通过网络发送 CMSampleBufferRef。然后,客户端通过音频队列服务播放CMSampleBufferRef。我见过一些关于堆栈溢出的例子,但大多数只是发送缓冲区。但随后一些信息就会丢失。我发现 [AVAssetReaderOutput copyNextSampleBuffer] 返回对 opaqueCMSampleBuffer 结构的引用。我知道如何获取 opaqueCMSampleBuffer 的内存地址,但是如何将地址的内容复制到数组中以便可以通过网络发送它?或者是否有更优雅的方法通过网络发送 CMSampleBuffer 。或者我什至可以以某种方式访问​​ opaqueCMSampleBuffer 吗?

感谢您的时间和帮助

最佳答案

以下是如何从 CMSampleBufferRef 创建 NSData 对象:

  1. 在接口(interface) (.h) 文件中,将示例缓冲区引用添加为属性,同时转换为对象:

    @property(非原子,强)__attribute__((NSObject)) CMSampleBufferRef SampleBuffer;

  2. 在实现文件(.m)中:

    CMSampleBufferRef 样本缓冲区 = (CMSampleBufferRef)[(AVAssetReaderTrackOutput *)[assetReader 输出][0] copyNextSampleBuffer];

    NSPurgeableData *sampleBufferData = (NSPurgeableData *)[self imageToBuffer:sampleBuffer];

要从 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;
}

关于objective-c - NSData 或来自 CMSampleBufferRef 的字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18811917/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com