在 iOS 中播放视频时处理字幕
Processing subtitles while video is playing in iOS
我需要对出现在屏幕上的本地(或远程)视频文件的字幕进行一些文本处理。目前我正在使用 AVPlayerItem
并且通过查看它的资产我可以看到有一个隐藏式字幕轨道,但我无法获得实际的字幕文本。所以问题是如何在显示字幕轨道时获取字幕轨道的实际文本(最好在 swift 中)。
http://www.slideshare.net/invalidname/stupid-videotricksdc2014 上的演示文稿应该为您提供所需的一切(参见 link 评论中的示例代码),因为 AVSubtitleReader 示例完全符合您的要求。
一旦您看到有文本轨道(closed-caption、字幕等),您需要获取该轨道,使用 AVAssetReader 打开它,然后开始读取样本缓冲区。每个都有一个演示时间戳和持续时间,然后是一个 CMBlockBuffer。该缓冲区的内容取决于您正在阅读的曲目类型,这些在 QuickTime 文件格式文档中有定义。在文本的情况下,它只是一个 Pascal 字符串:一个 big-endian UInt16 告诉你文本有多长,后面是文本本身。诚然,所需的 endian-flips 和数据复制在 C 中比在 Swift 中更自然,但它肯定是可行的。或者,将这部分留在它自己的 C 或 Obj-C 文件中,然后从 Swift.
调用它
我需要对出现在屏幕上的本地(或远程)视频文件的字幕进行一些文本处理。目前我正在使用 AVPlayerItem
并且通过查看它的资产我可以看到有一个隐藏式字幕轨道,但我无法获得实际的字幕文本。所以问题是如何在显示字幕轨道时获取字幕轨道的实际文本(最好在 swift 中)。
http://www.slideshare.net/invalidname/stupid-videotricksdc2014 上的演示文稿应该为您提供所需的一切(参见 link 评论中的示例代码),因为 AVSubtitleReader 示例完全符合您的要求。
一旦您看到有文本轨道(closed-caption、字幕等),您需要获取该轨道,使用 AVAssetReader 打开它,然后开始读取样本缓冲区。每个都有一个演示时间戳和持续时间,然后是一个 CMBlockBuffer。该缓冲区的内容取决于您正在阅读的曲目类型,这些在 QuickTime 文件格式文档中有定义。在文本的情况下,它只是一个 Pascal 字符串:一个 big-endian UInt16 告诉你文本有多长,后面是文本本身。诚然,所需的 endian-flips 和数据复制在 C 中比在 Swift 中更自然,但它肯定是可行的。或者,将这部分留在它自己的 C 或 Obj-C 文件中,然后从 Swift.
调用它