将 H.264 I 帧放入 AVSampleBufferDisplayLayer 但不显示视频图像

2024-04-22

在详细回顾了 WWDC2014、Session513 后,我尝试在 IOS8.0 上编写我的应用程序来解码和显示一个实时 H.264 流。首先,我成功构建了H264参数集。当我得到一个带有 4 位起始代码的帧时,就像“0x00 0x00 0x00 0x01 0x65 ...”一样,我将其放入 CMblockBuffer 中。然后我使用预览 CMBlockBuffer 构造一个 CMSampleBuffer。之后,我将 CMSampleBuffer 放入 AVSampleBufferDisplayLayer 中。一切正常(我检查了返回的值),除了 AVSampleBufferDisplayLayer 不显示任何视频图像。由于这些 API 对每个人来说都是相当陌生的,所以我找不到任何机构可以解决这个问题。

我将给出关键代码如下,如果您能帮忙找出视频图像无法显示的原因,我将不胜感激。多谢。

(1)AVSampleBufferDisplayLayer初始化。 dsplayer 是我的主视图控制器的 objc 实例。

    @property(nonatomic,strong)AVSampleBufferDisplayLayer *dspLayer;

if(!_dspLayer)
{
    _dspLayer = [[AVSampleBufferDisplayLayer alloc]init];
    [_dspLayer setFrame:CGRectMake(90,551,557,389)];
    _dspLayer.videoGravity = AVLayerVideoGravityResizeAspect;
   _dspLayer.backgroundColor = [UIColor grayColor].CGColor;
    CMTimebaseRef tmBase = nil;
    CMTimebaseCreateWithMasterClock(NULL,CMClockGetHostTimeClock(),&tmBase);
    _dspLayer.controlTimebase = tmBase;
    CMTimebaseSetTime(_dspLayer.controlTimebase, kCMTimeZero);
    CMTimebaseSetRate(_dspLayer.controlTimebase, 1.0);

     [self.view.layer addSublayer:_dspLayer];

}

(2)在另一个线程中,我得到一个 H.264 I 帧。 //构造h.264参数集ok

    CMVideoFormatDescriptionRef formatDesc;
    OSStatus formatCreateResult =
    CMVideoFormatDescriptionCreateFromH264ParameterSets(NULL, ppsNum+1, props, sizes, 4, &formatDesc);
    NSLog([NSString stringWithFormat:@"construct h264 param set:%ld",formatCreateResult]);

//构造cmBlockbuffer。 //databuf指向H.264数据。以“0x00 0x00 0x00 0x01 0x65 ........”开头

    CMBlockBufferRef blockBufferOut = nil;
    CMBlockBufferCreateEmpty (0,0,kCMBlockBufferAlwaysCopyDataFlag, &blockBufferOut);
    CMBlockBufferAppendMemoryBlock(blockBufferOut,
                                    dataBuf,
                                    dataLen,
                                    NULL,
                                    NULL,
                                    0,
                                    dataLen,
                                    kCMBlockBufferAlwaysCopyDataFlag);

//构造cmsamplebuffer ok

    size_t sampleSizeArray[1] = {0};
    sampleSizeArray[0] = CMBlockBufferGetDataLength(blockBufferOut);
    CMSampleTiminginfo tmInfos[1] = {
        {CMTimeMake(5,1), CMTimeMake(5,1), CMTimeMake(5,1)}
    };
    CMSampleBufferRef sampBuf = nil;
    formatCreateResult = CMSampleBufferCreate(kCFAllocatorDefault,
                         blockBufferOut,
                         YES,
                         NULL,
                         NULL,
                         formatDesc,
                         1,
                         1,
                         tmInfos,
                         1,
                         sampleSizeArray,
                         &sampBuf);

//放入AVSampleBufferdisplayLayer,仅一帧。但我在视图中看不到任何视频帧

    if([self.dspLayer isReadyForMoreMediaData])
    {
    [self.dspLayer enqueueSampleBuffer:sampBuf];
    }
    [self.dspLayer setNeedsDisplay];

您的 NAL 单元起始代码 0x00 0x00 0x01 或 0x00 0x00 0x00 0x01 需要替换为长度标头。

这在您所指的 WWDC 会议中明确指出,附件 B 起始代码需要替换为符合 AVCC 长度的标头。您基本上是在此处即时从附件 B 流格式重新复用为 MP4 文件格式(当然是简化的描述)。

为此,您在创建参数集时调用的是“4”,因此您需要为 VCL NAL 单元添加 4 字节长度的前缀。这就是为什么您将其指定为 AVCC 格式,长度标头可以更短。

无论您在 CMSampleBuffer 中放入什么内容都可以,如果内容可以解码,则不会进行完整性检查,只需满足任意数据与定时信息和参数集相结合所需的参数即可。

基本上,根据您输入的数据,VCL NAL 单元的长度是 1 字节。解码器无法获取完整的 NAL 单元并因错误而退出。

还要确保当您使用创建参数集时,PPS/SPS 没有添加长度字节,并且附件 B 起始代码也被删除。

另外,我建议不要使用 AVSampleBufferDisplayLayer,而是通过 VTDecompressionSession,这样您就可以执行颜色校正或像素着色器内所需的其他操作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 H.264 I 帧放入 AVSampleBufferDisplayLayer 但不显示视频图像 的相关文章

  • UIImageJPEGRepresentation 在视网膜显示屏上提供 2x 图像

    我有这段代码 它创建一个图像 然后向其添加一些效果并缩小其大小以使其largeThumbnail UIImage originalImage UIImage imageWithData self originalImage thumbnai
  • 加载新控制器时,iPhone 横向模式切换到纵向模式

    我的应用程序在横向模式下正确启动并且运行良好 BOOL shouldAutorotateToInterfaceOrientation UIInterfaceOrientation interfaceOrientation if interf
  • 什么是 WKWebView 中的 WKErrorDomain 错误 4

    fatal error LPWebView encounters an error Error Domain WKErrorDomain Code 4 A JavaScript exception occurred UserInfo 0x7
  • UIView晃动动画

    我试图在按下按钮时使 UIView 摇动 我正在调整我找到的代码http www cimgf com 2008 02 27 core animation tutorial window shake effect http www cimgf
  • 在 iOS 7 中 viewForHeaderInSection 部分是从 1 开始而不是从 0 开始

    我正在处理UITableView在我的项目中 这个项目是在 Xcode 4 5 中创建的 现在我正在使用 Xcode 5 所以我的问题是何时在 iOS 6 中运行我的项目 viewForHeaderInSection方法部分从 0 开始没问
  • 将 iPad xib 转换为 iPhone xib

    我看过很多关于将 iPhone xib 转换为 iPad xib 的帖子和教程 但我想反过来做 我能找到的唯一资源是 将 iPad 应用程序转换为 iPhone https stackoverflow com questions 68550
  • 将通配符包标识符转换为单个 ID

    我在应用程序商店中有一个使用通配符包标识符的应用程序 我想实现应用内购买 这需要非通配符ID 如何将现有应用的通配符 ID 转换为静态 ID 以进行应用内购买和推送通知 应用程序的捆绑标识符在更新之间必须始终保持相同 但 AppID 实际上
  • iPhone - 如何通过基于度数的位置获取方向

    首先 我在班级中实现了位置管理器功能 并且运行良好 并为我提供了当前位置 从那个位置我得到了如何获得位置度here http www switchonthecode com tutorials getting your location i
  • UISearchBar 取消按钮没有响应

    我已经实现了搜索栏 一旦用户将焦点放在搜索栏中 它就会显示取消按钮 为此我写了searchBar showsCancelButton YES in my searchBarTextDidBeginEditing方法 在searchBarSe
  • 自定义相机视图 Swift iOS 8 iPhone Xcode 6.1

    我想在 iPhone 的 View 中使用相机 我不想使用典型的全屏相机视图 而是我自己的 例如 我想在屏幕中间有一个 200x200 的正方形 并且有一个相机预览 在这个方块下面我想要一个拍照按钮 怎么做 我是新手 速度很快 你会想要使用
  • CoreBluetooth广告检测时间

    这个问题早在10月份就已经讨论过here https stackoverflow com questions 12866551 corebluetooth connection setup time varies quite a bit 1
  • MPMediaItemPropertyAssetURL 仅针对 iPhone 5s 返回 null

    我一直在使用以下代码从 MPMediaItemPickerController 返回的 MPMediaItem 对象中提取资产 url 以便我可以将音乐文件从用户 iPhone itunes 音乐库复制到文档文件夹进行处理 但在 iPhon
  • 特定时间的 iPhone 本地通知

    我想每周晚上 10 点 无论哪个国家 地区 发出通知 我需要使用时区吗 目前 我使用下面的代码每周触发通知 但如何在晚上 10 点准确触发通知 NSDate date NSDate date NSDate myNewDate date da
  • iOS 4.0 contentScaleFactor 和比例 - 在 3.1.3 中如何处理?

    我的任务是制作一个在 iOS 4 0 中运行的应用程序再次在 3 1 3 和 3 2 中运行 大多数情况下 它很简单 但处理新 API 的扩展和其他必须传递 返回值的情况很困难 respondsToSelector performSelec
  • 方向改变时重新定位控件

    我知道自动布局可用于在方向改变时使尺寸和位置保持一致 当方向改变时 是否可以完全改变布局 例如 请查看下面的纵向模式下简单登录屏幕的线框 现在 如果我旋转设备 我想完全重新定位控件 这种事情可以用自动布局来完成吗 如果没有 我该怎么办 谢谢
  • 如何在我的应用程序中添加应用内购买

    我想在我的应用程序中使用应用程序购买应用程序 但我不知道如何执行此操作 任何人都可以帮助我如何做以及源代码在哪里 给我链接或代码 这里有一堆链接 应用内购买编程指南 http developer apple com iphone libra
  • 在完成块中保留循环

    在我的课堂上 我创建了这个方法 void refreshDatasourceWithSuccess CreateDataSourceSuccessBlock successBlock failure CreateDataSourceFail
  • rightBarButtonItem 信息按钮,右侧没有空格

    我有一个UIViewController设置为在其右侧显示一个信息按钮UINavigationItem像这样 UIButton infoButton UIButton buttonWithType UIButtonTypeInfoLight
  • 如何检测 UISwipeGestureRecognizer 的结束?

    来自苹果文档 滑动是一种离散手势 因此每个手势仅发送一次关联的操作消息 void touchesEnded NSSet touches withEvent UIEvent event 当我使用 UISwipeGestureRecognize
  • 如何在 iOS 中通过 Twitter API 获取用户电子邮件地址?

    我尝试了多个 SDK 但无法从任何资源获取电子邮件 ID 我努力了FHSTwitterEngine为此目的 但我没有得到解决方案 FHSTwitterEngine twitterEngine FHSTwitterEngine sharedE

随机推荐

  • PHP 是如何工作的以及它的架构是什么?

    伙计们 最近我决定回到 PHP 并做一些比简单登录页面更复杂的事情 三年来我一直使用 Java JavaEE 进行编程 并且对 Java 应用程序的架构有很好的理解 基本上 一个虚拟机 一个简单的操作系统进程 运行称为字节码的编译代码 一个
  • Swift 优化级别破坏了 NSArray 到 Array 的转换

    以下 有点人为的 代码在以下情况下有效 快速优化级别被设定为无 Onone 默认用于调试 let nsa NSArray array foo bar let a nsa as String 但应用程序崩溃了 崩溃日志 http pasteb
  • 递归比较目录的 Shell 脚本

    我在外部硬盘驱动器上有一个几个月前的文件服务器备份 用于从那时起就出现故障的文件服务器 大部分数据已恢复到此后一直使用的临时文件服务器上 但存在一些不一致之处 我将安装外部并将其与当前数据同步 但首先我需要建立已在较新副本上更新的文件 我可
  • 如何检测用户是否为我的应用启用了 iCloud?

    我开发了一个支持 iCloud 的 iPhone 应用程序 但我面临的问题是 即使用户关闭我的应用程序的 iCloud 备份 它也会在 iCloud 上备份并反映我其他设备上的更改 所以我想知道如何我能知道我的应用程序是否启用了 iClou
  • .NET MAUI 导航动画

    如果我想在 MAUI 中为从一个页面到另一页面的过渡设置动画 我需要使用以下命令激活它true value await Shell Current GoToAsync nameof DashboardPage true 这会动画化页面从右到
  • Java 和 Jabber/Smack [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在尝试使用最新版本的 Smack 3 2 1 编写一个简单的示例 以便在两个帐户之间发送和接收消息 Connection connec
  • 比较击键 - 装配 CCS64

    I want to compare keystrokes in assembly CCS64 If I type in the same key in a row I want to do something example A A do
  • 如何从 Youtube 嵌入中删除暂停菜单视频建议/相关视频(类:ytp-pause-overlay)

    当我的嵌入视频暂停时 YouTube 显示带有视频建议的菜单 iframe 中的元素具有类 ytp pause overlay 如何在不删除控件的情况下删除它 如果您使用 Javascript 加载视频YouTube 播放器 iframe
  • 一个 AndroidManifest.xml 中包含两个 searchable.xml 活动

    我有一个 Android 应用程序 其中有一些不同的活动用于浏览从 RSS 下载的文章和图像 我希望能够提供连接搜索对话框中的搜索按钮 http developer android com intl zh TW guide topics s
  • 如何使用 PhantomReference 作为 Finalize() 替代

    Javadoc 8 的虚拟参考 http docs oracle com javase 8 docs api java lang ref PhantomReference html状态 虚拟引用最常用于调度验尸前与 Java 终结机制相比
  • Floyd Warshall 算法的时间复杂度

    Skiena 的算法书包含以下解释弗洛伊德 沃歇尔算法 http en wikipedia org wiki Floyd E2 80 93Warshall algorithm floyd adjacency matrix g int i j
  • 从MAC地址获取IP。 arp -a 不显示设备

    我正在尝试编写一个批处理文件 该文件应该在连接到网络 腾达 WiFi 路由器 时找到我的 Android 手机的动态分配的 IP 所以我正在尝试arp a并搜索我手机的 MAC 地址 以便我可以从表中获取其 IP C Users Leero
  • Firestore 增量 FieldValue

    所以 我知道有一些类似名称的问题 但这并不相同 我很好奇是否有人可以解释缺乏的原因increment哨兵 类似于delete one 据我所知 字段删除与文档更新没有什么不同 意思是 我可以delete我的字段只需将整个文档更新为一些新数据
  • 计算非连续值

    所以我有以下结构 guid current level current value pk a 100 12 1 a 200 12 2 a 200 12 3 a 200 12 4 a 200
  • 二分查找条件[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我总是对二分搜索算法的条件感到困惑 并且在编程竞赛中花费了我很多时间 我的问题是何时使用这些条件 1 while low lt high 2
  • 自 Android studio 3.5 起,辅助服务在每次运行时都会自动关闭

    由于我将 Android Studio 更新到 3 5 当我启动 Run 来构建和部署我的应用程序时 我的自定义辅助功能服务会自动关闭 不是崩溃 只是在设置中关闭 你能帮我吗 发生的情况是 Studio 在重新安装新版本之前强制停止该服务
  • 如何使用ng-style设置div的背景图片

    基本上我有一个链接 当单击它时 我会显示一个模式 现在我可以在模态上显示其他属性 例如标题 除了背景图像之外 呃呃 这是模态 div class modalContainer div div style padding top 10px s
  • iTunes Connect 提交代码签名权利错误 Xcode 8

    我在使用 Xcode 8 GM 提交最新的应用程序更新时遇到问题 我在此更新中更新了我的 iPhone 和 watchOS 应用程序 当尝试提交时 我收到以下错误 iTunes Store 操作失败 无效的代码签名权利 你的 应用程序包的签
  • 检测 Twitter 的 iOS 版本?

    显然 我对 Twitter oAuth 令牌请求 的使用在 iOS 5 中不起作用 我如何为 iOS 5 以下的任何内容保留此代码并使用适用于 iOS 5 的新 Twitter 框架 可以检测iOS版本吗 Thanks 您 几乎 永远不想查
  • 将 H.264 I 帧放入 AVSampleBufferDisplayLayer 但不显示视频图像

    在详细回顾了 WWDC2014 Session513 后 我尝试在 IOS8 0 上编写我的应用程序来解码和显示一个实时 H 264 流 首先 我成功构建了H264参数集 当我得到一个带有 4 位起始代码的帧时 就像 0x00 0x00 0