AVAssetReader, как использовать с потоком, а не с файлом?

AVAssetReader великолепен, но я вижу, как использовать его только с локальным активом, файлом или, я думаю, с композицией.

So,

assetReader = try AVAssetReader(asset: self.asset)
...
assetReader.addOutput(readerOutput)

и так далее,

Скажем, у вас есть входящий поток

(возможно, примеры файлов .M3U8 от Apple,

введите здесь описание изображения

https://developer.apple.com/streaming/examples/ )

На самом деле, можно ли использовать AVAssetReader для потоков? Или только локальные файлы?

Я просто нигде не могу найти это объяснение. (Может быть, это очевидно, если вы более знакомы с этим. :/)


person Fattie    schedule 15.12.2018    source источник


Ответы (1)


Это не очевидно. Объединение комментариев в заголовочном файле для AVAssetReader и AVComposition создает сильное впечатление API, разработанного только для локальных ресурсов, хотя язык явно не исключает нелокальные ресурсы.

Из заголовочного файла AVAssetReader:

Экземпляры AVAssetReader считывают мультимедийные данные из экземпляра AVAsset, независимо от того, является ли актив файловым или представляет собой сборку мультимедийных данных из нескольких источников, как в случае с AVComposition.

и от AVComposition:

AVComposition объединяет медиаданные из нескольких локальных файловых источников в пользовательском временном расположении для совместного представления или обработки медиаданных из нескольких источников. Все локальные аудиовизуальные ресурсы на основе файлов могут быть объединены независимо от типа контейнера.

Если вас интересует только видео и вы не возражаете против обработки как части воспроизведения, вы можете захватывать кадры с удаленного ресурса, добавляя AVPlayerItemVideoOutput к вашему AVPlayerItem. Если вы заинтересованы в аудио, вы в ручье.

person Rhythmic Fistman    schedule 15.12.2018
comment
Понятно. Фантастика, спасибо. Я думаю тогда действительно это только для файлов. Да, моя цель довольно проста (1) получить потоковый (например, .ts) поток H264. (2) разделить на разные (скажем, 2 или 3) потоки. каждый поток декодируется аппаратно (по сути, VTDecompression). Действительно это так! Я боюсь, что AVAssetReader, хотя и был бы намного проще, вероятно, не является ответом. - person Fattie; 16.12.2018
comment
Я пришел к выводу, что единственный способ сделать это на самом деле: (A) получить поток (B), в основном используя этот процесс.. stackoverflow.com/questions/29525000.. упаковать поток, готовый для VTDecompression, (C) отправить к VTDecompression, и все, используйте необработанные кадры. На самом деле B - обидчивая часть, я думаю. Должен признаться, я немного озадачен тем, как сделать просто A ! :) но есть пара примеров, таких как gityhub/Avois, так что все складывается :O Я надеялся на дешевое простое решение с AVAssetReader :) - person Fattie; 16.12.2018
comment
p.s. то, что я сказал, не совсем верно: некоторые удаленные ресурсы действительно работают с AVAssetReader, но вы должны сначала обернуть их в AVComposition. Удаленный mp4 у меня работал, а m3u8 - нет. Этот факт может сильно упростить ваш (B). (A) не так уж и плохо, файлы m3u8 - это просто текстовые файлы, указывающие (в конечном итоге) на mp4 (или что-то еще). В этом github.com/shogo4405/HaishinKit.swift могут быть некоторые указатели. - person Rhythmic Fistman; 18.12.2018
comment
Увлекательно, я исследую это. Фантастика. Интересная вещь - в моем случае я пошел по пути компиляции ffmpeg с нуля в приложение для iOS, а затем ... просто написал свой собственный ffmpeg с нуля. - person Fattie; 18.12.2018