Можно ли принудить AVFoundation к воспроизведению локального файла .ts?
Очевидно, что AVFoundation (и Quicktime X) может демультиплексировать и правильно воспроизводить кодированные контейнеры .ts
, потому что .ts
содержит контейнеры в потоковом режиме HTTPS.
За исключением настройки локальной веб-службы для обслуживания .m3u8
и связанных файлов .ts
, мне бы очень хотелось иметь возможность: убедить AVURLAsset
и/или URLAssetWithURL
принять локальный файл .m3u8
URI, как если бы это был URI HTTP, или, еще лучше, иметь возможность использовать AVQueuePlayer
для загрузки и воспроизведения последовательности файлов .ts
, не перескакивая через потоковые ходовые потоки.
Причина, по которой я хочу это сделать, заключается в том, что мне нужно локально генерировать видеоролики "на лету" несколько разрозненно - весь актив будет недоступен сразу, но будет создан с течением времени, Очевидно, что это поддается AVQueuePlayer
, но по разным причинам мои фрагменты активов упаковываются в контейнеры .ts
. Все это звучит так, будто оно идеально подходит для "локальных" потоков в прямом эфире.
Я подозреваю, что URLAssetWithURL
выполняет некоторую квалификацию переданной ему строки и затем устанавливает некоторые свойства, чтобы сигнализировать о том, что он смотрит на источник потоковой передачи, который, в свою очередь, сообщает AVPlayer
/AVQueuePlayer
, чтобы ожидать дорожек в .ts
форма. Вероятно, он видит HTTP и решает, что это потоковое вещание.
Итак, мой вопрос:, как можно "обмануть" AVFoundation в обработке локального файла .m3u8
точно так же, как он удаленный?
И вопрос бонуса: Кто-нибудь (и если да, то как) смог сделать AVAsset
из файла .ts
, чтобы ресурс вернул статус дорожек актива (подготовиться к воспроизведению)?
ТИА!
Ответы
Ответ 1
Эта проблема слишком долго раздражала нас. Наконец, мы решили написать инструмент для преобразования списка ts в файл mp4. Он состоит в использовании TSDemux для демонстрации и конкатенации видео/аудио, а затем генерации файла mp4 с помощью GPAC.
Он действительно отвечает на ваш вопрос, но это может быть способ сделать то, что вы хотите сделать.
Этот инструмент находится на Github, не стесняйтесь попробовать: https://github.com/Keemotion/TS2MP4
Ответ 2
Фактически вы можете создавать AVURLAssets непосредственно из основных ts файлов и воспроизводить их напрямую, очень похоже на способ воспроизведения файла mov или mp4.
Для каждого ts файла есть некоторые накладные расходы, поэтому лучше всего ставить файлы в один большой ts файл (на основе вашего содержимого m3u8) и воспроизводить этот большой файл.
Есть несколько файлов gotcha: AVCompositions, построенные с использованием AVAssets на основе ts файлов, являются голодными, поэтому избегайте AVCompositions, кроме небольших файлов. Вы не можете использовать AVAssets на основе ts файлов в эталонном фильме.