在 OS X 上使用 AVFoundation AVPlayer 显示字幕
Posted
技术标签:
【中文标题】在 OS X 上使用 AVFoundation AVPlayer 显示字幕【英文标题】:Show subtitles with an AVFoundation AVPlayer on OS X 【发布时间】:2012-07-03 13:35:15 【问题描述】:我正在尝试在 OS X 上使用 AVFoundation 播放视频时显示字幕。
我查看了文档,但找不到启用字幕轨道的方法。该 API 包含对字幕轨道的多个引用,这让我相信它是受支持的。
在 ios 上,-[AVPlayerItem selectMediaOption:inMediaSelectionGroup:]
方法用于启用字幕轨道。此方法在 10.7 SDK 中不可用。还有其他显示字幕的方法吗?
编辑: Quicktime Player X 支持字幕,例如在打开this movie 时,字幕子菜单似乎提供了语言选择,并在选择英语时显示它们。这让我相信它们包含在 API 中......
【问题讨论】:
你试过closedCaptionDisplayEnabled = YES
@DustinRowland 谢谢,我错过了。刚试了一下,据我所知没有任何改变。
对我有用的是使用 AVAsset 和 AVPlayerItem,这让我可以更好地控制我的对象。
closedCaptionDisplayEnabled
仅适用于隐藏式字幕轨道。它应该适用于来自 iTunes 的电影,并且绝对适用于从 EyeTV 导出的视频。它对字幕轨道没有影响。
@joerick 你找到解决这个问题的方法了吗?
【参考方案1】:
我自己也遇到了同样的问题。我发现不幸的是,除了切换到 QTKit 之外,唯一的方法是制作一个单独的字幕层(CATextLayer)并将其适当地定位为播放器层的子层。这个想法是,您设置一个周期性时间观察器,以每秒左右触发一次并更新字幕,以及(这是可选的)您可能拥有的一些 UI 元素,用于显示视频中经过的时间。
我创建了一个基本的 SubRip (.srt) 文件解析器类;你可以在这里找到它:https://github.com/sstigler/SubRip-for-Mac。请务必查看 wiki 以获取文档。该类在 BSD 许可条款下可用。
您可能会遇到的另一个挑战是如何动态调整 CATextLayer 的高度以适应不同长度的字幕和不同宽度的包含视图(如果您选择使其可调整大小)。我找到了一个很棒的 CALayoutManager 子类,它可以做到这一点,并对其进行了一些修改,以使其适用于我想要做的事情:https://github.com/sstigler/height-for-width。
我希望这会有所帮助。
【讨论】:
非常感谢。有用的答案,但我认为它不会在我的情况下起到作用。我们正在接收作为视频流或视频文件的一部分的字幕,我们目前无权访问 SRT 文件。如果我想出一种提取方法,可能会派上用场吗?!【参考方案2】:添加字幕文件的方法是使用 AVMutableCompositionTrack 将 scc 字幕作为 AVMediaTypeClosedCaption 轨道添加到 AVPlayer,播放器将控制它AVMediaTypeText轨道和播放器会显示字幕我不知道为什么这个AVMediaTypeSubtitle轨道支持什么字幕文件
【讨论】:
拜托,如果您能分享示例代码,那将非常有帮助。谢谢。 使用 sublerCLI 可以将 srt 或 scc 字幕转换为容器 m4v 中的 AVMediaTypeSubtitle 和 AVMediaTypeClosedCaption 轨道 ===============> var sublerTask = NSTask( ) sublerTask.launchPath = sublerPath // SublerCLI 路径 sublerTask.arguments = [ "-source",srtFilePath,"-dest",tempM4V,"-language",language,"-metadata", language] sublerTask.launch() sublerTask. waitUntilExit() 之后,您可以将 m4v 读取为 AVAsset 并从中获取字幕轨道以上是关于在 OS X 上使用 AVFoundation AVPlayer 显示字幕的主要内容,如果未能解决你的问题,请参考以下文章
Swift 4 - 在 mac os 上使用 AVAssetWriter 进行 avfoundation 屏幕和音频录制 - 视频冻结