使用 AVMutableVideoCompositionLayerInstruction 旋转视频

2024-06-19

我正在 iPhone 4 上使用前置摄像头拍摄视频,并将视频与其他一些媒体资源结合起来。我希望该视频为纵向 - 所有视频的默认方向都是横向,在某些情况下,您必须手动管理。

我正在使用 AVFoundation,特别是 AVAssetExportSession 和 AVMutableVideoComposition。根据 WWDC 视频,很明显,当我将视频组合成新的作品时,我必须自己“修复”方向。

因此,我创建了一个附加到 AVMutableVideoCompositionInstruction 的 AVMutableVideoCompositionLayerInstruction,并使用 setTransform:atTime: 方法来设置旨在旋转视频的变换:

    AVMutableVideoCompositionLayerInstruction *passThroughLayer = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:videoTrack];
CGAffineTransform portraitRotationTransform = CGAffineTransformMakeRotation(degreesToRadians(90.0));
[passThroughLayer setTransform:portraitRotationTransform atTime:kCMTimeZero];

问题是,当我查看导出的视频时,屏幕上没有任何实际内容。如果我将旋转角度减小到 45 度左右,我可以在屏幕上看到部分视频 - 几乎就好像它没有在中心点旋转一样。我在下面添加了图片,以便更清楚地了解我在说什么。

视频的自然尺寸恢复为 480x360。我尝试将其更改为 360x480,但它不会影响核心问题。

0 度旋转:

45 度旋转:

旋转90度就是全绿色的。

不管怎样,我希望以前做过这件事的人能给我指出正确的方向。我找不到有关 AVFoundation 组合和导出中一些更高级主题的任何文档。


建立在迄今为止回答的基础上。我找到了一种非常好的调试方法并找出转换中出现的问题。使用可用的渐变方法,您可以为变换设置动画,从而更轻松地查看变换正在执行的操作。

大多数时候,我发现自己的变换似乎没有任何作用,直到我意识到仅使用视频轨道的 PreferredTransform 属性可能会导致视频源移出渲染屏幕。

AVMutableVideoCompositionLayerInstruction *videoLayerInstruction = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:videoTrack];

[videoLayerInstruction setTransformRampFromStartTransform:CGAffineTransformIdentity
toEndTransform:videoTrack.preferredTransform 
timeRange:CMTimeRangeMake(projectClipStart, projectClipDuration)];

最终,我发现在某些情况下我需要应用翻译将旋转的视频带回渲染屏幕。

CGAffineTransformConcat(videoTrack.preferredTransform, CGAffineTransformMakeTranslation(0, renderSize.height))

注意:您的翻译值可能会有所不同。

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

使用 AVMutableVideoCompositionLayerInstruction 旋转视频 的相关文章

随机推荐

  • 列表初始化的缩小转换是错误还是只是警告? [复制]

    这个问题在这里已经有答案了 目前我正在自学C 入门第五版 文字说 当与内置类型的变量一起使用时 这种形式的初始化有一个 重要属性 编译器不会让我们列出内置类型的初始化变量 如果 初始化程序可能会导致信息丢失 这是示例代码 long doub
  • 如何更新中继存储而不推送到服务器

    我的 React Relay 应用程序中有一个表单 我用它来修改一些字段 我不想每次在输入中输入新字母时都发送服务器更新 如何使用 Relay 来支持应用程序状态而不总是推送到服务器 阅读了大部分 Relay 文档后 在我看来 我基本上必须
  • QByteArray 到整数

    正如您可能从标题中看出的那样 我在转换QByteArray为一个整数 QByteArray buffer server gt read 8192 QByteArray q size buffer mid 0 2 int size q siz
  • 如何在 Google App Engine 上部署 1 个实例

    我需要在 Google App Engine 上部署一个简单 Node js 应用程序的 1 个实例 无需任何形式的扩展 我试过做gcloud preview app deploy 但是即使在我尝试关闭它们之后 也会创建许多实例 我的目标是
  • 静态方法的 Java 内存模型

    我来自操作系统和 C 语言背景 在代码编译时 世界很简单 需要处理和理解堆栈 堆文本部分等 当我开始学习 Java 时 我确实了解 JVM 和垃圾收集器 我对静态方法感到很有趣 根据我的理解 类的所有实例都会在堆中创建 然后被清理 但是 对
  • 将 UNNEST 与 jOOQ 结合使用

    我正在使用 PostgreSQL 9 4 Spring Boot 1 3 2 和 jOOQ 3 7 我想 jOOQify 以下查询 SELECT id FROM users WHERE username IN SELECT FROM UNN
  • 设备旋转时的 SwiftUI 重绘视图组件

    如何在 SwiftUI 中检测设备旋转并重新绘制视图组件 当第一个出现时 我有一个 State 变量初始化为 UIScreen main bounds width 的值 但当设备方向改变时 该值不会改变 当用户更改设备方向时 我需要重新绘制
  • 参数编号无效:参数未在[重复]中定义

    这个问题在这里已经有答案了 被困在这里有一段时间了 当我尝试运行代码时收到此错误 警告 PDOStatement execute SQLSTATE HY093 无效参数 number 参数未定义于 Applications XAMPP xa
  • 检查图像文件是否存在,Robot-Framework,Selenium2Library

    我想知道是否可能以及如何检查应该显示图片的元素是否确实显示了图片 图片位于 img src 并且在同一域内 目前尚不完全清楚您的目标是什么 我认为可以安全地假设 如果您的代码执行正确的所有操作 即 URL 正确 并且 css 规则不会导致元
  • App Engine 上的 Django 与 webapp2 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 将 C# WCF 扩展性代码移至配置文件

    以下代码将 ParameterInspector 添加到端点 ChannelFactory
  • 在 VB2010 Windows 窗体开始时播放 .wav/.mp3 文件?

    制作 VB2010 已经大约一年了 最近开始突破我可以将哪种媒体合并到我的表单中的界限 但我无法播放 wav 或 mp3 文件 我尝试按照微软和其他编码网站上的教程进行操作 但没有成功 任何帮助 将不胜感激 要播放波形文件 您可以简单地使用
  • PyOpenCL:如何创建本地内存缓冲区?

    这里可能是非常简单的问题 但我已经搜索了几个小时但没有任何结果 我有这段代码 我希望有一个 256 位 8 uint32 bitstring gpu 作为设备中的本地内存指针 def Get Bitstring GPU Buffer ctx
  • SQLAlchemy 中 mssql+pyodbc 出现“数据源名称太长”错误

    我正在尝试使用 SQLAlchemy 和 pyodbc 将数据帧上传到 Azure SQL Server 数据库上的数据库 我已建立连接 但上传时出现错误 pyodbc Error IM010 IM010 Microsoft ODBC 驱动
  • 使用 jQuery 获取 ASP.Net Gridview 的 rowIndex

    您好 是否可以使用 jQuery 获取 gridview 的当前行索引 一点背景 我使用模板字段中的服务器端链接按钮从 gridview 中删除行 如下所示
  • PHP 数组到 JavaScript 数组

    假设我在 php 中有这个数组 cities array Caracas gt array air gt array 4 3 5 Working Days Saturday sea gt array 18 3 5 Days Wednesda
  • -all_load 其他链接器标志导致第 3 方框架中的重复符号错误

    我有一个用于内部应用程序的静态库 其中包含一些常见的实用程序代码 从以前的 SO 帖子中 我发现为了在运行时加载静态库中的类别 我需要包括 all load ObjC在 构建设置 中的 其他链接器标志 字段中 但是 对于我也在使用的闭源第三
  • 为什么 Backbone.js 模型的“on()”将“this”作为最后一个参数(如果它几乎总是如此)?

    我刚刚接触 Backbone 我不明白的一件事是为什么模型的 on 方法总是采用三个参数 事件 处理程序和上下文 似乎几乎总是 this 用于上下文 我还没有看到任何其他用法 即使有 因为我还没有见过 那一定是相当罕见的 所以我的问题是 什
  • 隐藏/显示 DIV - 将当前效果更改为淡入淡出

    我目前正在使用网络教程中找到的以下代码来显示 隐藏 DIV 效果很好 但不喜欢这种效果 希望 DIV 淡入 淡出 或者更平滑的东西 目前 DIV 是从右上角增长的 我该如何调整代码来做到这一点 你可以在这里看到它http jsfiddle
  • 使用 AVMutableVideoCompositionLayerInstruction 旋转视频

    我正在 iPhone 4 上使用前置摄像头拍摄视频 并将视频与其他一些媒体资源结合起来 我希望该视频为纵向 所有视频的默认方向都是横向 在某些情况下 您必须手动管理 我正在使用 AVFoundation 特别是 AVAssetExportS