Подтвердить что ты не робот

Как использовать AVFoundation для извлечения (или "demux" ) субтитров из видео mp4?

Я пытаюсь создать небольшую процедуру, которая будет принимать видео mp4 и извлекать информацию о субтитрах из видео с использованием рамки AVFoundation. При этом он будет создавать и возвращать NSArray элементов NSDictionary в формате startTimeOfSubtitle, endTimeofSubtitle и subtitleString.

Это то, что я собрал из заметки о выпуске для AVFoundation. Любой пример кода был бы очень оценен.

Спасибо заранее.

Выбор аудио и субтитров в соответствии с языком и другими критериями

Теперь AVFoundation предлагает функции для обнаружения параметров, которые могут предлагаться аудиовизуальными медиаресурсами для удовлетворения различных языковых предпочтений, требований доступности, пользовательских конфигураций приложений и других потребностей, а также для выбора этих параметров для воспроизведения. Например, ресурс может содержать несколько звуковых опций, каждый из которых имеет диалог, разговариваемый на другом языке, который должен быть выбран для воспроизведения, за исключением других. Аналогичные варианты на нескольких языках могут также предоставляться для читаемых носителей, таких как субтитры. Как контент на основе файлов, так и контент HTTP Live Streaming могут предлагать параметры мультимедиа. Чтобы получить информацию о группах опций, предлагаемых экземпляром AVAsset: • Загрузите значение доступного ключа AVAssetMediaCharacteristicsWithMediaSelectionOptions, используя AVAsynchronousKeyValueLoading. Когда загрузка завершена, [AVAsset availableMediaCharacteristicsWithMediaSelectionOptions] предоставит NSArray, который может содержать AVMediaCharacteristicAudible, AVMediaCharacteristicLegible или AVMediaCharacteristicVisual или любую их комбинацию, чтобы указать доступность групп взаимоисключающих опций.

• Каждая группа взаимоисключающих опций с интересующей средой может быть получена через [AVAsset mediaSelectionGroupForMediaCharacteristic:]. Чтобы получить звуковые параметры, пройдите AVMediaCharacteristicAudible и т.д. Каждая группа представлена ​​экземпляром AVMediaSelectionGroup. Каждый вариант внутри группы представлен экземпляром AVMediaSelectionOption. Оба эти класса определены в AVMediaSelectionGroup.h.

Чтобы просмотреть доступные параметры внутри группы и отфильтровать их для выбора для воспроизведения: • AVMediaSelectionGroup предлагает методы в категории AVMediaSelectionOptionFiltering, которые выполняют общие операции фильтрации на массивах AVMediaSelectionOptions в зависимости от того, являются ли варианты воспроизводимыми, соответствуют ли языку или имеют или не имеют специальных характеристик мультимедиа, например, предоставляют ли они специальные функции для обеспечения доступности, В AVMediaFormat.h определены параметры мультимедиа, которые указывают на наличие специальных возможностей, которые могут использоваться для фильтрации опций выбора мультимедиа.

• AVMediaSelectionOption предлагает информацию о параметрах, которые могут использоваться для отображения в пользовательском интерфейсе, который позволяет пользователям выбирать среди доступных опций или в реализации клиентских фильтрующих операций. В качестве примера опций фильтрации, определенных клиентом, в приложении, использующем пользовательские медиаресурсы, параметры могут считаться подходящими для выбора, только если их связанные метаданные содержат определенное значение.

• Чтобы выбрать конкретную опцию в группе для воспроизведения, используйте - [AVPlayerItem selectMediaOption: inMediaSelectionGroup:]. Чтобы узнать, какая опция выбрана для воспроизведения, используйте - [AVPlayerItem selectedMediaOptionInMediaSelectionGroup:].

Рекомендации о субтитрах

Особое внимание следует уделять при отображении параметров пользователю среди доступных разборчивых параметров для воспроизведения и при выборе между доступными разборчивыми параметрами в соответствии с предпочтениями пользователя. Некоторое разборчивое содержание содержит "принудительные" субтитры, что означает, что согласно намерению автора контента субтитры должны отображаться, когда пользователь не указал предпочтения для отображения субтитров и не сделал явного выбора опции субтитров. Принудительные субтитры обычно используются для того, чтобы передать значение разговорного диалога или видимого текста на языке, который предполагает поставщик контента, обычно не понимается, когда понимание диалога или текста тем не менее считается существенным. Убедитесь, что ваше приложение позволяет отображать их соответствующим образом, следуя приведенным ниже советам.

AVMediaSelectionGroup для характеристики AVMediaCharacteristicLegible может предоставить два типа разборчивых вариантов: 1) для отображения разборчивого контента, который считается выборным, а также контента, который считается существенным, и 2) для отображения только разборчивого содержания. Разумные элементы AVMediaSelectionOptions, которые содержат существенный контент, имеют только медиа-характеристики AVMediaCharacteristicContainsOnlyForcedSubtitles (определенные в AVMediaFormat.h). Если вы предлагаете разборчивые опции для отображения конечному пользователю в интерфейсе выбора или при рассмотрении вариантов субтитров для автоматического выбора в соответствии с предпочтением пользователя для языка, следует исключить разборчивые параметры с характеристикой AVMediaCharacteristicContainsOnlyForcedSubtitles. + [AVMediaSelectionOption mediaSelectionOptionsFromArray: withoutMediaCharacteristics:], указав AVMediaCharacteristicContainsOnlyForcedSubtitles как характеристику для исключения, можно использовать для получения разборчивых параметров, которые могут предлагаться конечному пользователю в интерфейсе выбора или для рассмотрения на выбор в соответствии с предпочтениями пользователя.

Если пользователь не указывает предпочтение или не делает выбор разборчивого контента, приложение должно выбрать один из разборчивых вариантов воспроизведения, который имеет характерные AVMediaCharacteristicContainsOnlyForcedSubtitles, если таковые имеются. Для большинства ресурсов, содержащих разборчивые параметры с принудительными субтитрами, соответствующий выбор между ними может быть выполнен в соответствии с текущим звуковым выбором. Используйте - [AVMediaSelectionOption relatedMediaSelectionOptionInMediaSelectionGroup:], чтобы получить разборчивый параметр, связанный с звуковым параметром. Если среди них нет других доступных средств, первый разборчивый вариант с принудительными субтитрами в группе выбора мультимедиа является подходящим по умолчанию.

4b9b3361

Ответ 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

Надеюсь, это было немного полезно;)