【问题标题】:How to use AVFoundation to extract (or 'demux') subtitle from mp4 video?如何使用 AVFoundation 从 mp4 视频中提取(或“解复用”)字幕?
【发布时间】:2012-05-30 12:30:58
【问题描述】:

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

这是我从 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:] 获取与可听选项关联的清晰选项。如果没有其他方法可供选择,则媒体选择组中第一个带有强制字幕的清晰选项是适当的默认值。

【问题讨论】:

    标签: ios avfoundation subtitle


    【解决方案1】:

    我不确定您是否能够获取字幕的开始时间和结束时间...我使用以下方法获取有关 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 documentation

    希望这有点帮助;)

    【讨论】:

      猜你喜欢
      • 2014-01-07
      • 1970-01-01
      • 2013-06-27
      • 1970-01-01
      • 2015-12-31
      • 1970-01-01
      • 1970-01-01
      • 2015-01-16
      • 2013-01-10
      相关资源
      最近更新 更多