如何使用AVFoundation从MP4视频中提取(或“解复用”)字幕?

23
我正在尝试创建一个小程序,使用AVFoundation框架从mp4视频中提取字幕信息。这样做将创建并返回一个NSDictionary元素的NSArray,格式为subtitleString的startTimeOfSubtitle,endTimeofSubtitle。

这是我从AVFoundation的发布说明中收集到的信息。非常感谢任何代码示例。

提前致谢。

根据语言和其他条件选择音频和字幕媒体

AVFoundation现在提供了功能,可以发现音频视觉媒体资源可能提供的选项,以适应不同的语言偏好、可访问性要求、自定义应用配置和其他需求,并选择这些选项进行播放。例如,资源可以包含多个听觉选项,每个选项都使用不同语言的对话进行讲述,以排除其他选项进行播放。类似的选项也可以为可读媒体(如字幕)提供多种语言支持。基于文件的内容和HTTP Live Streaming内容都可以提供媒体选项。要获取有关AVAsset实例提供的选项组的信息: • 使用AVAsynchronousKeyValueLoading加载AVAsset键availableMediaCharacteristicsWithMediaSelectionOptions的值。当加载完成时,-[AVAsset availableMediaCharacteristicsWithMediaSelectionOptions]将提供一个NSArray,其中可能包含AVMediaCharacteristicAudible、AVMediaCharacteristicLegible或AVMediaCharacteristicVisual,或者这些的任何组合,以指示互斥选项组的可用性。

• 可以通过-[AVAsset mediaSelectionGroupForMediaCharacteristic:]获取具有感兴趣的媒体特征的每个互斥选项组。要获取听觉选项,请传递AVMediaCharacteristicAudible等。每个组由AVMediaSelectionGroup的实例表示。组中的每个选项都由AVMediaSelectionOption的实例表示。这两个类都在AVMediaSelectionGroup.h中定义。

要检查组内的可用选项并对其进行筛选以进行播放选择:

•AVMediaSelectionGroup在AVMediaSelectionOptionFiltering类别中提供了一些方法,这些方法可以根据选项是否可播放、匹配所需区域设置以及是否具有特殊媒体特征(例如是否为辅助功能提供特定功能)对AVMediaSelectionOptions数组执行常见的过滤操作。用于指示辅助功能特性存在的媒体特性已在AVMediaFormat.h中定义,可以用于过滤媒体选择选项。
AVMediaSelectionOption提供有关可以用于显示用户界面中可选选项或用于客户端定义的过滤操作实现的选项的信息。例如,在使用自定义媒体资源的应用程序中,如果其相关元数据包含特定值,则可以考虑选项是否符合选择条件。
要选择组中用于播放的特定选项,请使用-[AVPlayerItem selectMediaOption:inMediaSelectionGroup:]。要发现当前选定用于播放的选项,请使用-[AVPlayerItem selectedMediaOptionInMediaSelectionGroup:]。
关于字幕的建议:在向用户显示可播放的可读选项以及根据用户偏好从可读选项中进行选择时,应格外小心。一些可读内容包含“强制”字幕,这意味着根据内容作者的意图,当用户既没有指示对字幕的显示偏好,也没有显式选择字幕选项时,应显示字幕。强制字幕通常用于在假定内容提供方认为不会普遍理解的语言中传达口头对话或可见文本的意义,但对话或文本的理解仍被认为是必要的。确保您的应用程序通过遵循以下建议来适当地显示这些字幕。一个用于 AVMediaCharacteristicLegible 特性的 AVMediaSelectionGroup 可以提供两种类型的可读选项:1) 显示被认为是与必要内容相比是可选的可读内容,和 2) 仅显示必要的可读内容。包含仅必要内容的可读 AVMediaSelectionOptions 具有媒体特性 AVMediaCharacteristicContainsOnlyForcedSubtitles(在 AVMediaFormat.h 中定义)。在选择界面向最终用户提供可读选项或根据用户对语言的偏好考虑字幕选项时,应排除带有特性 AVMediaCharacteristicContainsOnlyForcedSubtitles 的可读选项。可以使用 + [AVMediaSelectionOption mediaSelectionOptionsFromArray:withoutMediaCharacteristics:] 指定需要排除的特性 AVMediaCharacteristicContainsOnlyForcedSubtitles 来获取适合在选择界面中向最终用户提供的可读选项或根据用户偏好进行选择的可读选项。
如果用户没有表明对可读内容有任何偏好或没有进行选择,则应选择其中一个具有特性 AVMediaCharacteristicContainsOnlyForcedSubtitles 的可读选项进行播放,如果存在此类选项。对于大多数包含仅强制字幕可读选项的资源,可以根据当前可听选项选择适当的选项。使用 -[AVMediaSelectionOption associatedMediaSelectionOptionInMediaSelectionGroup:] 来获取与可听选项相关联的可读选项。如果没有其他方法可用来在它们之间进行选择,则媒体选择组中第一个具有强制字幕可读选项的可读选项是适当的默认值。
1个回答

2

我不确定你是否能够获取字幕的开始时间和结束时间... 我正在使用以下方法来获取HLS流中字幕选项的相关信息。

[tmpCurrentAsset loadValuesAsynchronouslyForKeys:[NSArray arrayWithObject:@"tracks"] completionHandler:^{
    dispatch_async(queueForMultipleAudioHandling, ^(void) {
        AVKeyValueStatus postLoadingStatus = [tmpCurrentAsset statusOfValueForKey:@"tracks" error:NULL];
        if (postLoadingStatus == AVKeyValueStatusLoaded)
        {
            AVMediaSelectionGroup * subtitleGroup = [self.mPlayer.currentItem.asset mediaSelectionGroupForMediaCharacteristic:AVMediaCharacteristicLegible];
            if (subtitleGroup) {

                _subtitles = subtitleGroup;

                dispatch_async(dispatch_get_main_queue(), ^{
                    [this createSubtitlePopOver];
                });


            }

        }

首先,您需要重新加载轨道并获取有关AVMediaCharacteristicLegible的信息。如果您已经有了这个信息,那么您可以像这样提取有关字幕的信息:_subtitles.options 这将给出一个AVMediaSelectionOption数组供您选择。如果您想要更多地了解AVMediaSelectionOption,则可以继续阅读此处:AVMediaSelectionOption文档

希望这对您有所帮助 ;)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接