如何使用AVFoundation从mp4视频中提取(或'demux')字幕?

时间:2012-05-23 22:26:50

标签: ios avfoundation subtitle

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

这是我从AVFoundation的发行说明中收集的内容。任何代码示例都将非常感激。

提前致谢。

  

根据语言和其他标准选择音频和字幕媒体

     

AVFoundation现在提供了一些功能,用于发现视听媒体资源可能提供的选项,以适应不同的语言首选项,可访问性要求,自定义应用程序配置和其他需求,以及选择这些选项进行回放。例如,资源可以包含多个可听选项,每个选项具有以不同语言说出的对话,以被选择用于回放以排除其他语言。还可以为诸如字幕之类的易读媒体提供多种语言的类似选项。基于文件的内容和HTTP Live Streaming内容都可以提供媒体选项。要获取有关AVAsset实例提供的选项组的信息,请执行以下操作:   •   使用AVAsynchronousKeyValueLoading加载AVAsset键availableMediaCharacteristicsWithMediaSelectionOptions的值。加载完成后, - [AVAsset availableMediaCharacteristicsWithMediaSelectionOptions]将提供可能包含AVMediaCharacteristicAudible,AVMediaCharacteristicLegible或AVMediaCharacteristicVisual的NSArray,或这些的任意组合,以指示互斥选项组的可用性。

     

•   可以通过 - [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作为要排除的特征,可用于获取适合在选择界面中提供给最终用户或根据用户偏好考虑选择的清晰选项。 / p>      

如果用户表示没有选择或不选择清晰的内容,则应用程序应选择具有特征AVMediaCharacteristicContainsOnlyForcedSubtitles(如果有)的播放清晰选项之一。对于包含仅使用强制字幕的清晰选项的大多数资源,可以根据当前的可听选择在其中进行适当的选择。使用 - [AVMediaSelectionOption associatedMediaSelectionOptionInMediaSelectionGroup:]获取与声音选项关联的清晰选项。如果没有其他可供选择的方法,则媒体选择组中第一个仅使用强制字幕的清晰选项是适当的默认选项。

1 个答案:

答案 0 :(得分: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 documentation

希望这有点帮助;)