大多数浏览器和
Developer App 均支持流媒体播放。
-
在 AV Foundation 中编辑影片
了解如何使用新的 AVMutableMovie 类来修改媒体文件并简化编辑工作流程。看看如何支持基于分段的编辑,并探索示例引用影片的强大功能。
资源
-
下载
AV Foundation编辑电影 欢迎来到506号讲座我是 蒂姆·门罗 是AVFoundation 工程团队成员今天我和大家谈谈 在AVFoundation 编辑电影的问题 讲述的内容很简单
AVFoundation 为编辑QuickTime 电影文件提供新类
哦 好啦 你可以做得更好 我们来听听掌声
谢谢
我对这样的功能感到兴奋 大家一会儿就会看到这会为我所管理的 个人项目提供工具在过去十年左右
我都在忙着这件事儿在某种程度上 这为我过去大约35年来所做的项目 带来了新的高度 对此我可是投入巨大 希望大家喜欢今天的讲座内容
我们可以编辑QuickTime 电影文件意味着什么 我们可以打开 QuickTime电影文件 对电影和轨道执行基于范围的编辑 可以选择一个部分电影的一个片段 复制到其他影片中 可以增减轨道 可以设置轨道间的联系 比如在另一个章节轨道的 一个轨道上做标记
可以增加或调整 轨道和电影元数据
我们可以创建电影文件 以及所谓URL样本引用电影文件
今天你会怎么做呢? 首先我会 根据AVFoundation中 现有的类来放置这些新类 然后我会做API爬虫文件 其中会介绍并触及 已经加入这些类的新方法的高点 最后我会回过头来返回谈一谈 我提到的这个个人项目 其中清楚显示了这些新功能 可以将我所搜集的大量数据 做出有趣的事情来
我们来谈谈 AVFoundation编辑类 如果已经在编辑环境用过 AVFoundation 就会知道我们将用到两个类操作抽象类 是复合类可以获得 AVCompositions 并在可变水平实现 AVMutableCompositions 现在复合类是很酷的内容 可以做出相当棒的效果 AVMutableComposition 只有一点 不如人意 没有标准文件格式用来 序列化复合类
这使得很难将你漂亮的 复合类和其他应用进行互换
我们前往 AVMovie和AVMutableMovie时 问题不复存在了因为其中 有QuickTime电影文件格式 我们可以打开 编辑重新编写
在轨道层面 我们有相似的设置 如大家所知 复合类包括复合轨道 并在可变水平 我们有 AVMutableComposition轨道 在El Capitan 我们可以在 轨道层面添加两个新类 AVMovieTrack和 AVMutableMovieTrack
我们的确有五个新类需要你们操心 电影和可变电影电影轨道 可变电影轨道 第五类叫做 AVMediaDataStorage 这是很简单的类全部任务 就是表明写入文件的 新样本数据在哪里该结束
AVMovie代表符合 QuickTime电影 文件格式的视频音频文件数据 如果你熟悉QuickTime电影 你会知道存在若干相关文件格式 都是基于QuickTime 电影文件格式转换而来 这些合称为ISO基媒体文件格式 AVMovie和可变电影 可以很好地处理这些 和应对QuickTime 电影文件没有区别
这些文件的主要特点是什么? 在我看来特点是 文件格式在样本数据 和组织样本进入轨道和电影的 数据间执行严格的区分
这里是QuickTime 电影文件的基本示意图 先是文件类型框 这是非常简单的少量数据表明这个文件 符合哪个系列中的文件格式 这里还有个电影框我刚说过 代表所有样本数据的组织信息 是在自身的框中可以找到 大部分的顺序都是任意的 文件类型框必须在最前面 但是其他框可以是任何顺序 那么我们可以把电影框放在文件最后 可以位于两个样本数据框的中间 甚至可以成为未用文件的部分 也许之前曾有过数据但是现在没有了
现在 电影框里是什么呢? 这里有我们今天要考虑的三类信息
首先是全局设置 没有这部分信息就 不会真正有电影的存在 其中包括电影中有多少轨道 电影时长是多少 文件何时生成播放时的最佳速率是什么
电影框里还有元数据 这属于 可选数据 对媒体播放而言 并非必不可少 但是如果具备也会有用 这有点像是版权声明的内容 表明作者是谁片名是什么 也许还有一些你或其他app写入 电影框中的自定义数据
在电影框中发现的最后一项内容 是轨道框这部分信息 定义了电影中的不同轨道
其中包括轨道类型 指出轨道所需的样本数据 也包括轨道元数据 当然 如果愿意 也可以 在这里编写自定义轨道元数据 还有轨道相关性的相关信息 也就是电影中轨道 和其他轨道之间的关联
这里的主要特点是样本数据位置 因此样本数据本身并不存在于轨道框中 轨道框包括到样本数据的参考信息之类
对样本数据而言轨道可能会 存在于其他文件中 这样你也可以有外部样本参考
还可以是只有外部样本数据的样本参考 在这种情况下小电影框 及其文件类型框 被叫做样本参考电影文件 框中并无真实数据 它只是指向其他位置的数据 现在这成为你与其他媒体文件
一起工作时功能非常强大的工具
为什么?因为我可以编辑少量信息 而不需要触及大量媒体数据
但是 可以想象这其中会有一些脆弱性
为什么呢?因为我在参考数据 数据 如果所参考的数据手 碰巧在移动或者是被删掉我就会很糟心 我再也不能播放演示作品了
可以通过两种方式降低这种脆弱性 主要是通过相关URL 当我制作这些样本参考时 我们会些许看到该怎么做
在今天结束的时候大家可能会想 试试自包含电影 如果想给朋友看看 或是在网页上发送发帖 需要这么做的时候 可以通过 AVAssetExportSession 运行自己的可变电影 可以获得极好的自包含文件
好的我们现在来看刚引入的 电影编辑API
在不可变层面 AVMovie是AVAsset 不可变的子类 我们实际上做了些有趣的事情 我们可以查看电影 可以获得电影头文件 可以在新文件中编写电影头文件
所谓电影头文件我是指文件类型框 和电影框而不是样本数据
怎样初始化AVMovie? 如果初始化过 AVRL 就知道该怎么做了 你提供URL我们返还AVMovie
如果有电影头文件比如说在 粘贴板上则可以进入 并从数据块生成电影 在讲座中我们不会更多探讨这方面问题 但是如果你看样本代码包 AVMovieEditor 则会清楚看到该怎样把内容 从粘贴板提取或放置
这里就是可以轻松 生成样本参考电影文件 我们将把URL作为 AVMovie打开 不好意思我们调用... 我们想生成的文件类型指示 然后是部分选项 在本例中 我们指定的 选项是电影头文件的删节目的地 基本上而言 这是指如果有任何数据 在该URL上它都会被挤走 最后在文件中就只剩电影头文件
还可以是不同的选项 不再挤走文件中已有的任何数据 这就是将电影头文件 添加到目的地选项
我们来继续讲 AVMovie的可变子类 AVMutableMovie 这会提供基于范围的 电影编辑 增减轨道 增加或调整电影 元数据的编辑方法
怎样初始化 AVMutableMovie? 和初始化AVMovie的 做法基本相同 我们会传递一个URL但是在本例中 我们需要能够 调整可能会出现的任何错误
还可以从零建造 AVMutableMovie 本代码行给我们返回 空的AVMutableMovie文件 我们可以在其中添加轨道 接着在轨道中添加部分数据等等
这些是在AVMutableMovie 可用的片段编辑方法 如果大家用过 AVMutable复合类 这很相似因为实际上 只有一处存在例外
就是插入时间范围方法 会需要额外的参数 表明你是否要复制样本数据 到目标文件或仅仅复制样本参考
如果复制样本数据到目标可变电影 你需要告知它编写样本数据的位置 它不会默认做任何事情 例如 它不会自己将数据编写在 电影框所在的文件中 所以必须明确规定你需要 将写入电影的任何新的样本 数据放置的位置 可以通过规定可变电影的默认 媒体数据存储属性来实现 这就是该 AVMediaDataStorage类出马啦 同样 它此刻只是包裹了URL
有生成和删除轨道的方法要生成轨道 必须要表明所需的轨道类型 要的是视频轨道是音频轨道等等 如果喜欢如果有现有轨道 希望以此复制新轨道我们把它作为 参数传递 从现有轨道 使用它们 采取相关的属性
这里有个简单的小案例研究 为更新现有电影文件 我们可以从URL打开 使用我们刚才所见的方法做些编辑 然后我们可以使用正确的电影头文件 作为URL方法 将电影 头文件写入相同文件 这就是就地编辑 这里 我们并未移动任何样本数据 我们所做的就是调整电影框 并把它放回相同的文件
我们来谈谈轨道编辑API
这可以允许我们调整 QuickTime电影文件的轨道 我们有基于范围的轨道编辑 正如我们在电影层面所见 我们还可以设置轨道之间的关联性 可以增加或调整轨道元数据
这里是片段编辑方式 它们看似熟悉因为我们刚刚见过
在电影层面唯一的不同在于 我们没有插入资产的时间范围 而是插入了轨道的时间范围
同样 当我们插入 时间范围时 必须规定 你是否想要复制样本数据 还是只想放入样本参考 如果复制样本数据轨道必须要知道 样本数据要去往何处 通过使用在电影层面完全相同的类 设置轨道的媒体数据电影层面所见
这里是另一个案例研究 假设这里有一小段剪辑 我想做静音处理 也许这段剪辑中有部分不合时宜的语言 很简单 只要找到电影 第一个音频轨道定义时间范围即希望 静音的范围 删除时间范围 在相同的点插入空的时间范围 这个代码的净效果就是在原先的不当 语言处加入了空片段
处理轨道关联性相当简单 可以增加轨道关联性 或删除轨道关联性 稍后我们来看怎样使用
我说过 当复制样本 数据进入轨道后 我会告知大家 怎样使用相关URL 要这样做 打开每个轨道 我们会设置样本参考基URL属性 到包括电影的电影部分共同父类 包括电影框的文件和包括所有 媒体数据的文件
好 我们来继续...
讲我说过的 个人项目我想称之为 《血字(和灰字)研究》 需要向柯南·道尔爵士致歉 我们回到1980年 我们说的是什么? 35年前 当时我还是伯克利海湾区 那边的研究生 需要找个方法释放多余的精力 我出去买了轮滑鞋因为我发现伯克利
是轮滑者的理想场所位置 因为这里有些不错的山地
我非常喜欢我不断去找 更高的山爬上去之后再滑下来 1984年 你们可以看到 我在奥克兰克莱蒙大道的顶端 远处 你可以看到旧金山 是海湾区的这一侧 是爱莫瑞维尔这非常棒 几乎就像从我面前轮滑飞驰而过
我不太清楚举起手是做什么 也许是为了我们要誓死效忠的什么东西 我可没准备豁出命去 很好
为了跟踪我的位置我去买了街道地图 我把自己设成黄色高亮 我开始在地图上标出自己去过的地方 那里的山地非常好 如果你和我一样这么做会糟糕的很 因为最后会把整幅地图都涂满颜色
然后是2000年 不好意思 大约是1985年我在弄一个项目 我称之为蒂姆的奥克兰疯狂轮滑之旅 或简称轮滑之旅目标很简单 就是在奥克兰的每条街道都轮滑 滑过街道的全长
从1985年一直持续到2005年 所以十年前 我完成了 怎么样?
谢谢
在奥克兰需要滑过 近800英里的公路 才能实现这个目标
2005年完成时 我没有位置数据 我开始时GPS还没有发明出来 当时可能是没有的 实际上我有所有的位置数据 因为如果打开我的地图
你会看到在右侧都是黄色 不全是 但是阿拉米达皮埃蒙特 爱莫利维尔有整整9码的距离
我当时没有视频 如果大家回想那个时候 1985年扛的相机都是大块头 还很娇气外出轮滑的时候 肯定是不希望背着的
所以当我完成的时候 我的确是... 这是个疯狂的项目这点我承认 我绝对没有花心思告诉任何人这件事 可是不巧 估计《旧金山纪事报》 听说了此事
并且写了篇文章报道 就是那种有人情味的故事
奥克兰市参议会得知此事 通过一项决议表彰了此项 卓绝的壮举... 是他们这么说的 不是我
奥克兰的几个制片人听说此事 花费了几年时间为这个项目 拍摄了漂亮的小纪录片 在一年前在湾区的独立 剧场进行了几轮上映 简直是太疯狂了
在我完成这个项目大约两年后 我开始在东海岸花了些时间 特别是在马萨诸塞州波士顿 更是在剑桥 我想 好吧 就让这事儿 继续上路吧 我花了几年时间 在剑桥和萨默维尔轮滑 最后产生了 波士顿轮滑之旅的想法 同样的想法 在波士顿的每条街道轮滑
大概是从2011年开始的 我看了看地图估计需要5年时间 来完成这件事情
前几年的冬天也不大冷 城市大小和奥克兰差不多 在两年半的时间我就完成了 因此在2013年5月 我完成了波士顿轮滑之旅
这次我就有准备了因为在轮滑时 我在头盔上装了运动摄像机 iPhone上还有 GPS app 结果就是我攒了490个 MPEG-4文件拍摄了 200次不同的轮滑 共有1.5万亿字节的数据
我还有GPX文件形式的GPS数据 是那种XML版本的 位置数据 大家稍后会看到 有着大约150兆字节的数据
可想而知影片会是什么样子 我们来看其中一个
这些是摄像机直接拍摄的视频 我只是做了重新命名这样有了日期 和文件名 会让我更容易查找
我们在QuickTime 播放器中打开 这是第二个是接在第一个的 结尾部分继续 我们来选中第一个视频 我们可以看到阳光明媚 是在11月下旬 当时是工作日 我们来播放 看得出是秋天因为地上有落叶 如果有音频文件也许会听得到 当天的呼呼风声
不过 令人感觉有些奇怪 因为街上没有人 没有一个行人 我们往前快进一点 还是没有行人只是有些车子 我在朗伍德医疗区 这里交通很是拥堵 却没有人 这是商业区
没有人 像个鬼城 出什么事儿了? 我们稍后会解决这个问题
基本上我所获得的 是一以大堆干草 还有一把银针 我制作了500小时的视频 即便99%都没什么用处 那也还能找出5小时有趣的视频
不过 部分问题是我甚至不 知道这些银针是什么样 因为我不知道500小时视频中 哪些比较重要
我知道 我喜欢看部分内容 这里用了蒙太奇手法
下雪了 真的吗?好吧
我没看见路面坑洼吗?
这是我最喜欢的一部分 因为大家可以看到 我在往下滑 往前滚动返回 继续滑行 如果不是... 谢谢大家
现在我必须花钱找人帮我挑 看过全部视频的1/50 才挑出这6个剪辑 理论上 这一大堆干草中 会有300个精彩的摔跤镜头
要知道 每个跟头5秒钟的话 我们就会有25分钟这类素材 这的确看起来很有趣
现在我想怎么来用所有这些数据 我有1.5万亿太字节的视频数据 想拿来做点什么 我想找出那些银针
第一步是要把每次滑轮的摄像 不同文件连接到一起 做成样本参考电影文件 这样我可以打开编辑 而不必担心摄像文件
第二是我想加入索引元数据 作为电影元数据 那么我要进入文件并做标记 好了 我这里开始摔跤 这就是摔跤的结束部分 这里是狗开始追我的地方 这里是它们最后觉得 没办法抓到我的地方 这里是我和执法官员交谈 这些还会继续
我希望对所有素材都进行索引 这样便于搜索 发现 所有的银针 可以调用
我还想加入GPS数据 还有所有的 位置数据 我还什么都没处理 我希望把它加到文件里 这样可以做成定时元数据轨道
关键在于 我做所有这些都不会修改 最初原始的摄像机文件 并可以将需要进行的 数据复制数量最小化
好的 具体该怎样做呢? AVMovie和AVMutableMovie 为我们提供答案 第一个问题的解决方案相当简单 我准备用这些摄像机文件 生成样本参考电影文件 它会指向两个原始文件 非常简单就是样本参考 电影文件的标准用法
第二步的解决方案会在电影框中 加入一些额外的自定义元数据
第三步是在新的样本参考电影文件中 加入真实的媒体数据 这些媒体数据 即便叫做定时元数据 也是作为媒体数据或样本数据存储 并会进入文件的新轨道
我准备这么来处理问题 第一步其实非常简单 作为可变电影打开第一个的电影 我们会打开第二个 以及任何后续的电影作为URL资产
我们会在准备插入的资产中定义范围 这就是整个资产时长
我们会在可变电影的结尾将它插入 可变电影中记住不要复制样本数据 我最后只要样本参考 最后 我们所需要做的 就是在新文件中 编写新的电影头文件生成样本参考 电影文件来指向两个原始 摄像机文件中的数据
我们来看部分演示 看怎样解决第二个和第三个问题 通常 这个幻灯片是阅读演示 但我对好的回文没有免疫力
而且也不愿意浪费 Alvin是基于 AVFoundation 的线性索引器的缩略
就是用来做我说过的索引工作 而且可以把位置数据加入文件中 UI大概是这样 我把电影视图放在左边 地图视图放在右边 下面可以看到有些显示区 是我搜集来的轮滑相关信息的显示
我们继续打开电影文件 这是我刚生成的样本参考电影文件 打开 我准备加载GPX文件 我会选择适当的GPS文件
我打开文件时 需要填写部分数据 它会指出这将用多久完成 怎样?好了 我可以扩展地图视图 清楚显示我们在哪里 我出去在布鲁克林四周兜了一圈 这很适合你这里是洛根机场 绝对是波士顿 这里是剑桥 我们仔细看看 哦 我说过要给大家看GPX文件 GPX文件就是这个样子 是XML格式经纬度 海拔 时间标记 就是它了 再没别的
我们来这里运行Web服务 我出去到政府Web 服务器看看当天的天气情况 怎样我发现当天风很大 风速平均每小时17英里 对喜欢用公制的人来说 就是28.439华氏度 还有种有趣说法3.9摄氏度
那天是感恩节所以街上没有人 对了 这说明那天正好过节 还是犹太光明节的第二天
对吧?来看这些Web Services这就可以让我们 推断出为何街上没人
我跑到另一个Web Service 叫做反向地理编码 我会从Apple服务器 发出经纬度它会返还 州 城市 街道的样子 有时甚至还有门牌号 基本上 就会提供 我所经过的街道信息 等一下 所有的街道图钉会落下
然后我们可以选出一个 来看是哪条街道是联邦大道
或是布鲁克林的华盛顿大街
我这里还加了搜索条可以输入 比如联邦大道如果发现就会标亮 如果把数据放入文件 现在就完成了街道名称的可搜索性 我可以进入 找到所有 在某条街道的小剪辑
我们可以隐藏这些需要做的最后一件事 就是用地址数据同步视频 我试过各种自动方法来完成 结果发现最好的办法 只有一种 就是前往 我视频中的帧 这里我知道在地图上自己的位置 然后我会来到地图
点击并同步视频和这个位置 现在 当我这么做时如果返回 并开始播放视频 大家会看到图钉会沿着视频移动 看 这就是在同步
我甚至可以前往另一个方向 我去地图上的某个位置可以点击 让视频到这里现在我就在联邦大道了 我知道这里是很有趣的下坡路段 我们可以滑行一秒钟 这就是我们这么做的原因这类下坡没有 汽车经过会有什么状况呢?
好的这就是Alvin 大家可以看出Alvin可以帮我解决 第二和第三个问题 可以添加自定义元数据 到样本参考电影文件
基本是这样的 通过调用... 将现有的元数据 来看元数据属性 我们会生成新的元数据项 我们会相应填入属性 例如 平均风速值是我从政府服务器 获得的当天天气情况数据 我还创建了部分识别器可以以后查找 一旦把这些写入文件加上正确的电影 头文件到URL电影就全部升级了
我们再来看看第三步 是将位置数据作为定时元数据轨道 大家已经知道该怎么做了 如果去年来过 听过《驾驭音频视频 媒体中的元数据》讲座 其中他们介绍过两个内容 首先从捕获会话得到位置数据 以及怎样将正确时间的元数据加入电影 我们可以获得位置数据在GPX文件中 我们并不需要捕获会话内容 我们可以关注在第二个样本 代码包中获得源代码 并把它放入Alvin
现在 我们一旦完成在盘里会得到 带有单个元数据轨道的定时文件 我们所需要做的就是复制轨道到 电影的新轨道中 可以打开通过GPS资产来实现
我们接着会运用 轨道中恰好有的媒体类型在电影文件中 添加新轨道我们会从轨道中复制设置
最后 我们将范围插入新轨道 同样如果在文件中 编写头文件 我们弄好了
现在需要做的最后一件事这是可选内容 就是在定时媒体轨道 和元数据的任何轨道之间 生成轨道关联性在本例中 我们已经选定了视频轨道
如果跳过这一步定时视频轨道 则会整体运用到文件中 关于这些 我们都没问题
如果你们在用 AVMutableMovie 这里还要注意两点
如大家所知 AVMovie 或AVMutableMovie 属于AVAsset因为它是子类 如果可将AVAsset做什么 处理的话可以用在可变电影中 例如 可以用 AVPlayerItem来播放 可以用AVAssetImageGenerator 从中抓取图像
可以用 AVAssetExportSession来输出
如果在可变电影中进行任何这样的操作 我们非常建议你对可变电影 进行拷贝 因为如果你在输出时 是在改变电影文件要以防不测 只要进行拷贝在输出即可一切都没问题
第二个最佳实践是如果你在打开 希望插入 AVMutableMovie的资产
则应该设置这个旗标 AV URL资产喜好精确时长 和定时键为真 现在我们并未在大家已经见到的任何 代码片段中这么做因为你 打开QuickTime电影文件时 旗标已经设置为真 但是如果需要打开MP3文件 例如希望将之插入可变电影文件 你需要设置这个旗标
我们来总结一下
我们加入了新类 来支持QuickTime电影文件
我希望如大家所见这让我们的工作流程 会变得非常简单非常不错 我们可以处理参考电影 而不是原始的电影本身 因此 如果在处理大量的数据 这会非常得力
如果想在知道在实践中怎么操作 下载AVMovieEditor 仔细看看
若想了解更多详情就去标准场所 如果这方面存在问题在周四和周五 我们会在实验室 如果想看看 怎样运用复合类 转到2010年的讲座看看 最后 如果大家想详细了解怎样进行 定时元数据轨道生成 可以看看去年的讲座 《在音频视频媒体中驾驭元数据》
非常感谢
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。