В своем веселом проекте я загружаю видеофайл с YouTube и записываю в файл на локальном диске. Одновременно я хочу играть в нее. Цель состоит в том, чтобы кэшировать файл на локальном диске, чтобы при повторном просмотре видео приложение могло воспроизводить его локально, тем самым экономя пропускную способность.
я использую Python 3.3.1
, PyQt4/Phonon
а также LibVLC. Пока что я могу делать следующие вещи:
Учитывая YouTube часы URL, я могу скачать видео файл и затем играть в нее, используя PyQt4 / Phonon и LibVLC, независимо. Это не потоковый.
Поскольку LibVLC поддерживает потоковую передачу, я могу воспроизводить данный URL через потоковую передачу.
Второй вариант очень близок к тому, что я хочу сделать, но поскольку он не сохраняет файл на диске, в следующий раз я не смогу воспроизвести то же видео локально.
Я ищу некоторые рекомендации относительно того, как действовать дальше. В частности, как воспроизвести видео из неполного файла, который все еще записывается в.
Я полностью в порядке с любым API (который делает работу), пока он:
И я также ищу альтернативные подходы, если мой текущий подход не верен или делает проблему более сложной, чем она есть на самом деле.
VLC поддерживает воспроизведение неполных файлов, поэтому, если вам нужно немного неблокирующего ввода-вывода и / или параллельного кода, вы сможете начать загрузку, и после того, как будет написано достаточное количество, используйте LibVLC для запуска воспроизведение. В зависимости от того, какой алгоритм сжатия используется, вам может понадобиться достаточно буферизовать, чтобы в буфере всегда оставалось несколько секунд данных — если я правильно помню, некоторые из более современных алгоритмов записывают дельты и информацию индекса в прямом и обратном направлении.
Вы можете получить несколько предупреждений / сообщений об ошибках / исключений, но я бы не стал считать их фатальными — пусть качество воспроизведения будет вашим руководством!
Это несколько похоже на некоторые предложения из комментариев выше, а также связано с тем, что сказал @abarnert, в меньшей степени с обменом с @StackedCrooked.
Других решений пока нет …