将CMSampleBuffer转换成UIImage
这是一个函数(来自Apple文档的代码),将CMSampleBuffer转换为uiimage func imageFromSampleBuffer(sampleBuffer: CMSampleBuffer) -> UIImage { // Get a CMSampleBuffer's Core Video image buffer for the media data var imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) // Lock the base address of the pixel buffer CVPixelBufferLockBaseAddress(imageBuffer, 0) // Get the number of bytes per row for the pixel buffer var baseAddress = CVPixelBuff
10 2023-11-03
编程技术问答社区
将AudioBuffer转换为CMSampleBuffer,并具有精确的CMTime
这里的目标是通过avcapturedataoutput通过视频创建MP4文件,并记录了CoreAudio.然后将cmsamplebuffers发送给随附的AvassetWriterInput(Avediatypepevideo)和AvassetWriterInput(avmediatiatypepeaudio) 我的音频编码器副本将录音机传递给新的cmsamplebuffer,将其传递到avassetwriterInput(avmediatypeatepeaudio).此示例是如何完成AudioBuffer转换为CmsampleBuffer. conversTion to cmmsamplebuffer 长话短说,它行不通.该视频显示了,但没有音频. ,但是,如果我评论了视频编码,则将音频写入文件并听到. 从经验中告诉我这是一个时机问题. conversTion to cmmsamplebuffer 确实显示 CMSampleTimingInfo ti
14 2023-10-08
编程技术问答社区
深度复制音频CMSampleBuffer
我正在尝试创建AVCaptureAudioDataOutputSampleBufferDelegate中的captureOutput返回的cmsamplebuffer的副本. 我遇到的问题是我的框架来自代表方法captureOutput:didOutputSampleBuffer:fromConnection:在我将它们保留在CFArray>中后被删除. 显然,我需要创建进一步处理的传入缓冲区的深层副本.我也知道CMSampleBufferCreateCopy仅创建浅副本. 关于: 的相关问题很少: 从cmsamplebuffer中抽取数据为了创建深层副本 cmimagebuffer或cvimagebuffer的深副本 但它们都没有帮助我正确使用 CMSampleBufferRef copyBuffer; CMBlockBufferRef data = CMSampleBufferGetDataBuffer(sampleBuffer); CMFormat
24 2023-10-07
编程技术问答社区
在没有压缩的情况下,仍然捕获UIImage(来自CMSampleBufferRef)?
我需要从未压缩图像数据中获得UIImage.我正在使用代码: captureStillImageOutput captureStillImageAsynchronouslyFromConnection:connection completionHandler:^(CMSampleBufferRef imageSampleBuffer, NSError *error) { // that famous function from Apple docs found on a lot of websites // does NOT work for still images UIImage *capturedImage = [self imageFromSampleBuffer:imageSampleBuffer]; } ios/#QA/QA1702/_index.html 是指向imageFromSampleBuffer函数的链接. ,但它无法正
52 2023-05-06
编程技术问答社区
iOS-自动调整CVPixelBufferRef的大小
我正在尝试根据用户的输入来裁剪和缩放CMSampleBufferRef,在ratio上,以下代码采用cmsamplebufferref,将其转换为cvimagebufferref,并使用cvpixelbuffer根据其字节来裁剪内部图像.这个过程的目的是让裁剪和缩放的cvpixelbufferref写入视频 - (CVPixelBufferRef)modifyImage:(CMSampleBufferRef) sampleBuffer { @synchronized (self) { CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); // Lock the image buffer CVPixelBufferLockBaseAddress(imageBuffer,0); // Get information
6 2023-05-05
编程技术问答社区
为什么AVSampleBufferDisplayLayer停止显示从AVCaptureVideoDataOutput'的委托中获取的CMSampleBuffers?
我想通过AvSampleBufferDisplaylayer显示一些cmsamplebuffer,但是在显示第一个示例后冻结. 我从avcapturevideodataoutputsamplesbuffer委托中获取样品扣: -(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection { CFRetain(sampleBuffer); [self imageToBuffer:sampleBuffer]; CFRelease(sampleBuffer); } 将它们放入向量 -(void) imageToBuffer: (CMSampleBufferRef )source{ //buffers
14 2023-05-05
编程技术问答社区
CMSampleBufferRef kCMSampleBufferAttachmentKey_TrimDurationAtStart崩溃。
这困扰着我一段时间.我有视频转换以将视频转换为" .mp4"格式.但是在某些视频中发生了一次崩溃,但不是全部. 这是崩溃日志 *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[AVAssetWriterInput appendSampleBuffer:] Cannot append sample buffer: First input buffer must have an appropriate kCMSampleBufferAttachmentKey_TrimDurationAtStart since the codec has encoder delay' 这是我的代码: NSURL *uploadURL = [NSURL fileURLWithPath:[[NSTemporaryDirectory() stringByAppe
48 2023-05-04
编程技术问答社区
如何将CMSampleBufferRef转换为NSData
如何将cmsamplebufferref转换为nsdata? 我设法通过在上关注Erik Aigner的答案来获取MPMediaItem的数据,但是数据是类型CMSampleBufferRef. 我知道cmsamplebufferref是一个结构,并在 cmsamplebuffer参考在iOS开发库中,但我认为我完全不了解它是什么. cmsamplebuffer函数似乎都不是一个明显的解决方案. 解决方案 在这里,您可以为音频示例缓冲区工作,这就是您正在查看的内容,如果您想查看整个过程(将所有音频数据从mpMediaItem获取到文件中,请访问CMSampleBufferRef ref=[output copyNextSampleBuffer]; // NSLog(@"%@",ref); if(ref==NULL) break; //copy data to file //read next one AudioBufferList audioBufferList; N
16 2023-05-04
编程技术问答社区
iOS-缩放和裁剪 CMSampleBufferRef/CVImageBufferRef
我正在使用avoundation并从AVCaptureVideoDataOutput中获取样品缓冲区 - (void)writeBufferFrame:(CMSampleBufferRef)sampleBuffer { CMTime lastSampleTime = CMSampleBufferGetPresentationTimeStamp(sampleBuffer); if(self.videoWriter.status != AVAssetWriterStatusWriting) { [self.videoWriter startWriting]; [self.videoWriter startSessionAtSourceTime:lastSampleTime]; } [self.videoWriterInput appendSampleBuffer:sampleBuffer]; } 我现在
62 2023-05-03
编程技术问答社区
核心提示:在CMSampleBufferRef上渲染一个透明的图像,结果周围出现黑框。
我正在尝试在我使用Avfoundation的AvcaptureVideDataOutput录制的视频中添加水印/徽标. 我的课程设置为SampleBufferDelegate,并接收CMSampleBufferrefs.我已经对cmsamplebufferrefs cvpixelbuffer应用了一些效果,然后将其传递给avassetwriter. 左上角的徽标使用透明的PNG传递. 我遇到的问题是,Uiimage的透明部分是黑色的,一旦写入视频. 有人知道我做错了什么或可能忘记了吗? 代码片段下面: //somewhere in the init of the class; _eaglContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2]; _ciContext = [CIContext contextWithEAGLContext:_eaglContext
10 2023-04-07
编程技术问答社区
CMSampleBufferGetImageBuffer的内存泄漏
我从a cmmsamplebufferref 视频缓冲区的每个n视频帧中获得 uiimage ,例如: - (void)imageFromVideoBuffer:(void(^)(UIImage* image))completion { CMSampleBufferRef sampleBuffer = _myLastSampleBuffer; if (sampleBuffer != nil) { CFRetain(sampleBuffer); CIImage *ciImage = [CIImage imageWithCVPixelBuffer:CMSampleBufferGetImageBuffer(sampleBuffer)]; _lastAppendedVideoBuffer.sampleBuffer = nil; if (_context == nil) { _contex
40 2023-03-25
编程技术问答社区
调整由captureStillImageBracketAsynchronouslyFromConnection:withSettingsArray:completionHandler提供的CMSampleBufferRef尺寸。
在我正在处理的应用中,我们正在捕获需要具有4:3宽高比的照片,以最大化我们捕获的视野.现在我们使用AVCaptureSessionPreset640x480预设,但现在我们需要更大的分辨率. 据我所知,唯一的其他两个4:3格式为2592x1936和3264x2448.由于这些对于我们的用例来说太大了,因此我需要一种缩小它们的方法.我看了一群选项,但没有找到一种方法(优于没有复制数据),以有效的方式在不丢失EXIF数据的情况下以有效的方式执行此操作. vImage是我调查的一件事之一,但据我所知,数据需要被Coppied并且Exif数据将丢失.另一种选择是从jpegStillImageNSDataRepresentation提供的数据创建一个UIImage,缩放它并返回数据.这种方法似乎也涉及exif数据. 这里的理想方法将直接调整缓冲区内容并调整照片的大小.有没有人知道我怎么会去做这个? 解决方案 我最终使用imageio来调整目的.在这里离开这段代码以防有人遇到同
24 2023-01-20
编程技术问答社区
如何设置CMSampleBuffer的时间戳用于AVWriter的写作
我正在使用Avfoundation来捕获和录制音频.有一些我不太了解的问题. 基本上,我想从Avcapturesession捕获音频并使用Avwriter编写音频,但是我需要在我从Avcapturesessess中获得的cmmsamplebuffer的时间戳进行一些转移.我阅读了cmsamplebuffer的文档,我看到了时间戳的两个不同术语:"演示时间戳"和"输出演示时间戳".两者中有什么不同? 假设我从avcapturesessess中获得一个cmmamplebuffer(用于音频)实例,我想使用avwriter将其写入文件,我应该用什么函数将cmtime'注入cmtime到buffer,以设置演示时间戳它在结果文件中? 谢谢. 解决方案 使用cmmsamplebuffergetPresentationTimestamp,那是捕获缓冲区并且应在播放时"呈现"以同步时"呈现"的时间.在WWDC 2012上引用第520节的报价:"演示时间是麦克风拾取缓冲区中的第
8 2023-01-20
编程技术问答社区
将AVAssetWriter与原始NAL单元一起使用
我在iOS文档中注意到AVAssetWriterInput您可以将nil传递给outputSettings字典来指定不应重新编码输入数据. 用于编码附加到输出的媒体的设置.通过零以指定不应重新编码附加的样本. 我想利用此功能传递到RAW H.264 NALS的流中,但是我很难将原始字节流调整为CMSampleBuffer,我可以将其传递到AvassetWriterIntup的appendSampleBuffer方法中.我的NALS流仅包含SPS/PPS/IDR/P NALS(1、5、7、8).我无法找到有关如何使用AvassetWriter使用预编码的H264数据的文档或结论性答案.无法播放结果的视频文件. 如何将NAL单元正确包装到CMSampleBuffers中?我需要使用启动代码前缀吗?长度前缀?我需要确保只放一个nal per CMSampleBuffer吗?我的最终目标是使用H264/AAC创建MP4或MOV容器. 这是我一直在玩的代码: -(vo
14 2022-12-13
编程技术问答社区
将AudioBufferList转换为CMBlockBufferRef错误
我正在尝试使用 AVAssetReader 读取视频文件并将音频传递给 CoreAudio 进行处理(添加效果和内容),然后再使用 AVAssetWriter 将其保存回磁盘.我想指出,如果我将输出节点的 AudioComponentDescription 上的 componentSubType 设置为 RemoteIO,则可以通过扬声器正常播放.这让我确信我的 AUGraph 设置正确,因为我可以听到一切正常.不过,我将 subType 设置为 GenericOutput,这样我就可以自己进行渲染并取回调整后的音频. 我正在阅读音频并将 CMSampleBufferRef 传递给 copyBuffer.这会将音频放入一个循环缓冲区中,稍后将读取该缓冲区. - (void)copyBuffer:(CMSampleBufferRef)buf { if (_readyForMoreBytes == NO) { return; }
168 2022-08-13
编程技术问答社区
在iOS中如何在解码视频时获得每一帧视频的时间戳.mp4
场景: 我正在编写一个 iOS 应用程序 来尝试解码 videoFile.mp4.我正在使用 AVAssetReaderTrackOutput 和 AVAssetReader 从视频文件中解码帧.这很好用.我得到每个 &videoFile.mp4 中的每一帧基本上都使用以下核心逻辑. 代码: AVAssetReader * videoFileReader; AVAssetReaderTrackOutput * assetReaderOutput = [videoFileReader.outputs objectAtIndex:0]; CMSampleBufferRef sampleBuffer = [assetReaderOutput copyNextSampleBuffer]; sampleBuffer 是这里每个视频帧的缓冲区. 问题: 如何在这里获取每个视频帧的时间戳? 换句话说,&更详细地说,如何我可以获取从 copyNextSampleBuffer
514 2022-08-13
编程技术问答社区
设置AVSampleBufferDisplayLayer渲染采样缓冲区的速率
我正在使用 AVSampleBufferDisplayLayer 来显示来自网络连接的 h.264 格式的 CMSampleBuffers.视频播放流畅且工作正常,但我似乎无法控制帧速率.具体来说,如果我在 AVSampleBufferDisplayLayer 中以每秒 60 帧的速度排队,它会显示这 60 帧,即使视频是以 30 FPS 的速度录制的. 创建样本缓冲区时,可以通过将计时信息数组传递给 CMSampleBufferCreate 来设置演示时间戳(计时信息不存在于 h.264 流中,但可以计算或以容器格式传递).我设置的演示时间戳相隔大约 0.033 秒,持续时间为 0.033,但显示层仍然每秒显示尽可能多的帧. 有两种方法可以在 AVSampleBufferDisplayLayer 上将缓冲区排入队列:当缓冲区准备好时,通过调用 -[AVSampleBufferDisplayLayer enqueueSampleBuffer:] 来“约束",或者通过调用 -[
2140 2022-07-17
编程技术问答社区