Ответ 1
Идея:
Основная идея достаточно проста. Вы должны дублировать выходной поток и перенаправлять его в файл. Это делается, поскольку Maresh правильно указал, используя директиву sout = # duplicate {...}.
Рабочее решение:
На моей машине ™ работает следующее решение. Я тестировал его на Ubuntu 12.10 с VLC v2.0.3 (TwoFlower) и Python 2.7.1. Я думаю, что он также должен работать на Python 3, так как большая часть тяжелого подъема вообще выполняется libVlc.
import os
import sys
import vlc
if __name__ == '__main__':
#filepath = <either-some-url-or-local-path>
movie = os.path.expanduser(filepath)
if 'http://' not in filepath:
if not os.access(movie, os.R_OK):
print ( 'Error: %s file is not readable' % movie )
sys.exit(1)
instance = vlc.Instance("--sout=#duplicate{dst=file{dst=example.mpg},dst=display}")
try:
media = instance.media_new(movie)
except NameError:
print ('NameError: % (%s vs Libvlc %s)' % (sys.exc_info()[1],
vlc.__version__, vlc.libvlc_get_version()))
sys.exit(1)
player = instance.media_player_new()
player.set_media(media)
player.play()
#dont exit!
while(1):
continue
Полезные ссылки
- Справка по командной строке была необходима для расшифровки множества VLC Параметры командной строки.
- Глава 3 потоковой передачи VLC HowTo. Объясняет структуру потока, его директивы и описывает различные доступные модули. В главе 4 приведены некоторые примеры.
- Документация API LibVLC в случае, если вы хотите изменить параметр мультимедиа в во время выполнения
Обновление - сохранение видео на YouTube:
Приведенный выше код не похож на YouTube. Я обыскал и обнаружил, что для преобразования видеопотока YouTube в обычный видеоформат можно использовать дополнительную директиву transcode
. Я использовал #transcode{vcodec=mp4v,acodec=mpga,vb=800,ab=128,deinterlace}
- vcodec = mp4v - это формат видео, который вы хотите кодировать (mp4v - MPEG-4, mpgv - MPEG-1, а также h263, DIV1, DIV2, DIV3, I420, I422, I444, RV24, YUY2).
- acodec = mpga - это аудиоформат, который вы хотите закодировать (mpga - это уровень звука MPEG 2, a52 - A52, то есть звук AC3).
- vb = 800 - это битрейт видео в Кбит/с.
- ab = 128 - битрейт аудио в Кбит/с.
- deinterlace сообщает VLC об отключении видео на лету.
Обновленный код выглядит следующим образом:
import os
import sys
import vlc
if __name__ == '__main__':
#filepath = <either-some-url-or-local-path>
filepath = "http://r1---sn-nfpnnjvh-1gil.c.youtube.com/videoplayback?source=youtube&newshard=yes&fexp=936100%2C906397%2C928201%2C929117%2C929123%2C929121%2C929915%2C929906%2C929907%2C929125%2C929127%2C925714%2C929917%2C929919%2C912512%2C912515%2C912521%2C906838%2C904485%2C906840%2C931913%2C904830%2C919373%2C933701%2C904122%2C932216%2C936303%2C909421%2C912711%2C907228%2C935000&sver=3&expire=1373237257&mt=1373214031&mv=m&ratebypass=yes&id=1907b7271247a714&ms=au&ipbits=48&sparams=cp%2Cid%2Cip%2Cipbits%2Citag%2Cratebypass%2Csource%2Cupn%2Cexpire&itag=45&key=yt1&ip=2a02%3A120b%3Ac3c6%3A7190%3A6823%3Af2d%3A732c%3A3577&upn=z3zzcrvPC0U&cp=U0hWSFJOVV9KUUNONl9KSFlDOmt4Y3dEWFo3dDFu&signature=D6049FD7CD5FBD2CC6CD4D60411EE492AA0E9A77.5D0562CCF4E10A6CC53B62AAFFF6CB3BB0BA91C0"
movie = os.path.expanduser(filepath)
savedcopy = "yt-stream.mpg"
if 'http://' not in filepath:
if not os.access(movie, os.R_OK):
print ( 'Error: %s file is not readable' % movie )
sys.exit(1)
instance = vlc.Instance("--sout=#transcode{vcodec=mp4v,acodec=mpga,vb=800,ab=128,deinterlace}:duplicate{dst=file{dst=%s},dst=display}" % savedcopy)
try:
media = instance.media_new(movie)
except NameError:
print ('NameError: % (%s vs Libvlc %s)' % (sys.exc_info()[1],
vlc.__version__, vlc.libvlc_get_version()))
sys.exit(1)
player = instance.media_player_new()
player.set_media(media)
player.play()
#dont exit!
while(1):
continue
Пара важных моментов:
Я использовал MPEG аудио и видео кодеки в директиве transcode. Кажется, важно использовать соответствующие расширения для выходного файла (в этом случае mpg). В противном случае VLC запутывается при открытии сохраненного файла для воспроизведения. Имейте это в виду, если вы решите переключиться на другой видеоформат.
Вы не можете добавить обычный URL-адрес YouTube в качестве пути к файлу. Вместо этого вы должны указать местоположение самого видео. Это причина, по которой путь к файлу, который я использовал, выглядит настолько загадочным. Этот путь к файлу соответствует видео в http://www.youtube.com/watch?v=GQe3JxJHpxQ
. Сам VLC может извлекать местоположение видео с данного URL-адреса YouTube, но libVLC не делает этого из коробки. Для этого вам придется написать свой собственный резольвер. См. этот связанный вопрос SO. я выполнил этот подход, чтобы вручную разрешить местоположение видео для моих тестов.