我正在寻找一种在终端(不是在浏览器或其他窗口中,而是在任何bash会话中)上观看YouTube视频的方法。

是否有一种简单的方法?我想像这样的东西:

$ youtube <video-url>     


我已经知道如何使用mplayer播放视频:

但是,这会打开一个新窗口。在终端上播放会很酷。

它也应该与tmux会话兼容。


我问了另一个问题,如何防止打开新窗口。对于那些想知道我在哪里需要这种功能的人,我启动了一个名为TmuxOS的实验项目,其概念是所有内容都应在tmux会话中运行。

所以,确实,我需要一个用于本地和远程视频的视频播放器。 :-)

评论

你是这个意思吗google.com/…

@chaos完全正确。 :-)我正在寻找这几个月,但是什么都没有找到。决定在这里问...

VLC可以播放Youtube视频,但不确定是否具有终端输出功能。

使用mpv,您可以执行mpv 。它也适用于许多其他视频网站。但这会打开一个新窗口。

这是一个有趣的问题,我从答案中学到了很多东西。但是出于好奇-为什么在地球上您需要这样做? ;-)

#1 楼

您可以下载视频和/或仅音频,然后使用youtube-dl观看/收听它们。我相信该脚本是用Python编写的,并且使用了ffmpeg

$ youtube-dl --help
Usage: youtube-dl [options] url [url...]

Options:
  General Options:
    -h, --help                       print this help text and exit
    --version                        print program version and exit
    -U, --update                     update this program to latest version.
                                     Make sure that you have sufficient 
                                     permissions (run with sudo if needed)
...
...


要下载视频,您只需在想要播放视频的页面上为其提供URL,脚本会完成其余操作:

$ youtube-dl https://www.youtube.com/watch?v=OwvZemXJhF4
[youtube] Setting language
[youtube] OwvZemXJhF4: Downloading webpage
[youtube] OwvZemXJhF4: Downloading video info webpage
[youtube] OwvZemXJhF4: Extracting video information
[youtube] OwvZemXJhF4: Encrypted signatures detected.
[youtube] OwvZemXJhF4: Downloading js player 7N
[youtube] OwvZemXJhF4: Downloading js player 7N
[download] Destination: Joe Nichols - Yeah (Audio)-OwvZemXJhF4.mp4
[download] 100% of 21.74MiB in 00:16


然后您可以使用vlcmplayer在本地观看这些视频:

$ vlc "Joe Nichols - Yeah (Audio)-OwvZemXJhF4.mp4"
VLC media player 2.1.5 Rincewind (revision 2.1.4-49-gdab6cb5)
[0x1cd1118] main libvlc: Running vlc with the default interface. Use 'cvlc' to use vlc without interface.
Fontconfig warning: FcPattern object size does not accept value "0"
Fontconfig warning: FcPattern object size does not accept value "0"
Fontconfig warning: FcPattern object size does not accept value "0"
Fontconfig warning: FcPattern object size does not accept value "0"


确定,但是我想以ASCII格式流式传输这些视频。

我发现了这篇博客文章,标题为:在ascii,youtube和放手中,它们演示了我在聊天室中讨论的方法,主要使用youtube-dl作为“后端”,它可以下载YouTube流,然后将其重定向到其他应用。

本文显示了它是通过mplayer完成的:

$ youtube-dl http://www.youtube.com/watch?v=OC83NA5tAGE -o - | \
    mplayer -vo aa -monitorpixelaspect 0.5 - 


通过youtube-dl上方的STDOUT重定向-o -正在下载的视频。这里有一个效果演示。



通过安装其他库,可以进一步增强ASCII视频。


/>
好,但是我想在实际的终端中播放视频吗?

我在O'Reilly的标题为“以ASCII观看视频”中发现了一种可以在xterm中播放视频的技巧。 Art。

$ xterm -fn 5x7 -geometry 250x80 -e "mplayer -vo aa:driver=curses j.mp4


上面的结果导致打开了播放视频的xterm窗口。



所以我想,为什么不像这样将花生酱和巧克力放在一起:

$ xterm -fn 5x7 -geometry 250x80 -e \
    "youtube-dl http://www.youtube.com/watch?v=OC83NA5tAGE -o - | \
    mplayer -vo aa:driver=curses -"


这几乎可以工作!我不确定为什么视频无法在窗口中播放,但似乎应该能够播放。窗口打开并开始播放,然后关闭。我看了短短几秒钟的视频,然后什么也没有。

也许上面的内容使您更接近最终解决方案,或者可能只是需要对选项进行一些调整。

其他库

如果安装了libcacaaalib的彩色版本),然后将gnome-terminal中的字体大小减小到很小,例如3,以下命令将直接在终端内显示更好看的ASCII视频:

$ CACA_DRIVER=ncurses mplayer -vo caca video.mp4




端子

看来,选择mplayer是否可以直接在终端内播放或是否可以直接在终端内玩耍它会打开一个单独的窗口。在mplayer上缓存也可以直接在那些终端上播放产生巨大的变化。

使用此命令,我可以在terminator上播放,至少可以播放之前的视频的1/4。剪切:

$ youtube-dl http://www.youtube.com/watch?v=OC83NA5tAGE -o - | \
    mplayer -cache 32767 -vo aa:driver=curses -


彩色版本使用此命令:

$ youtube-dl http://www.youtube.com/watch?v=OC83NA5tAGE -o - | \
    CACA_DRIVER=ncurses mplayer -cache 64000 -vo caca -


这些相同的命令可以在其中播放gnome-terminalxterm也是如此。



注:那是(从左到右)xtermterminatorgnome-terminalterminology

评论


您可以用术语来玩-而不仅仅是w / caca库。您可以使用终端转义符指定终端窗口的映射部分,然后在高清窗口中直接播放它。您甚至可以将视频设置为背景并对其进行处理。术语也可以理解URI-获取指向您的youtube视频的webm链接,然后将其打印到屏幕上,就像终端提示一样。

–mikeserv
2014年10月10日,下午3:17

@mikeserv-太酷了,从来没有听说过该终端模拟器。我尝试过,可以在后台播放视频很酷,tybg my.avi可以做到。

–slm♦
2014年10月10日,下午3:48

是的-我更喜欢printf方法。 tybg somefile | sed -n l看看它是如何工作的-它只使用扩展的终端转义符。它们记录在手册页中。您可以使用ty {ls,cat}进行相同的操作。但是那些小应用程序只是真实的旧演示程序包装,可能没有那么强大。无论如何,如果您的版本是在最近几个月内构建的,那么您可能会像我一样喜欢miniview-请执行ctrl + shift + h。所有的启发都一样好-这就是为什么我建议您最近尝试一下。它也快疯了。

–mikeserv
2014年10月10日在4:12

所说的其他ASCII库是什么?

– PythonNut
2014年10月10日,下午4:20

@slm太糟糕了,我想只是deb-multimedia版本启用了它。不知道其他人为什么不这样做,猜想他们可能认为libcaca是个玩笑和膨胀。

–德罗伯特
2014年10月15日,0:55

#2 楼

因此,在撰写本文时,使用术语(可能是终端仿真器曾经发生过的最好的事情)进行了以下工作:

ytplay() ( 
    init() if     [ "${#1}" -gt 0 ] && i=$? du= f=
           then   durl \! \" \# $ \% \& \' \( \) \* \
                       \+ \, \/ \: \; \= \? \@ \[ \]
                  : >"${f:=${2:-/tmp/vid}.$(
                      durl "" 's/.*mime=[^/]*.\([^&]*\).*//'
                  )}"
                  init() { loop; }
           else   ! echo 'NO LINK SPECIFIED!' >&3
           fi
    durl() if    [ "${#du}" -eq 0 ]
           then  du=$(for c do printf 's/%%%X/\%s/g;' "'$c" "$c"; done)
           else  curl -s "" | { shift
                 sed '/.*url_encoded_fmt_stream_map[^,]*url=/!d
                      s///;s/,.*//;s/\u0026/\&/g;'"$du$*"; }
           fi
    loop() if    [ "$((i=$i+1))" -le 5 ] &&
                 sleep "$(($i*2))" 
           then  play || kill "$pid" || :
           else  ! echo 'ERROR RETRIEVING VIDEO!' >&3
           fi
    play() if    [ -s "$f" ]
           then  printf '3}bt%sq4312078q' "$f"; exit
           fi
    while init "$@" || exit
    do    curl -s "$(durl "")" >"$f" & pid=$!
    done  3>&2 2>/dev/null
)


terminology的特定位是then-play()行中的printf 3}...块。 terminology接受扩展的终端转义符,用于将媒体打印到屏幕上-有点像提示色,但也包括高清视频以及基本上您想要的其他任何内容。

剩下的是curl | sed脚本的一点点:


将常规的youtube链接作为其第一个参数...



ytplay 'https://www.youtube.com/watch?v=${id}'等...


提取HTML并找到用于备用下载流的相关javascript代码...


执行curl "$yturl" | grep url_encoded_fmt_stream_map以查看整个块。


从该块中选择第一个提供的备用流。


提供了许多内容-如果您执行了上面的grep,则会在"报价中找到该列表-分隔...stream_map: "字段。
起初我以为我只会越来越多地得到mp4,而我也得到了webms。因此,我已经对其进行了流编辑,并按mime类型分配了文件扩展名。 -无论如何,这就是我正在寻找的东西,因此这里没有选择其他人的逻辑。我的最新编辑添加了一些模块化/显式测试,以实现这一目标。有关我最初编写该函数时引用的perl脚本的信息,请参见此内容。


%[[:hexdigit:]]\{2\}编码解析为工作链接。


请参阅此内容工作参考。


尝试最多下载5次文件,但有一点退后。


默认情况下,文件为/tmp/vid.${mime-type},但如果使用第二个参数调用ytplay,它将解释为目标下载文件名-同时仍根据mime类型附加扩展名。


如果下载目标经过任何尝试,其大小都大于零,则它允许下载在后台继续进行,并在后台退出时在后台打印terminology的位置媒体,否则它只会给出向上并留下一条错误消息,大写大写。




3}bt[LINK/FILE]pn进行全窗口播放。 .mp4会弹出一个新窗口。还有其他一些在几何上限制游戏区域的方法-例如仅限制一部分窗口。 ,但到目前为止,它对于每个链接都可以正常工作,只有一个-而且因为我实际上对观看未播放的链接并不感兴趣,所以我没有试图找出原因。
它对所有文件都有效,但不一定每个文件都播放-这是因为起初我盲目将terminology扩展名附加到目标文件中,而没有检查它是否正确。我以前没看过的那个可能也是这个。无论如何,我都将其更改为处理该问题。

正如我之前提到的,唯一的play()特定位在最后一个函数-mplayer中,因此您可以轻松地将其更改为所需的任何功能与下载/下载的视频文件一起使用-例如将其与vlc的CACA libs在另一个终端中一起使用,或者将其弹出到terminology窗口中。但是,如果您喜欢自己,可以在terminology中以高清晰度观看它。

最后,这通常非常快-到目前为止,我的速度在每次尝试中都最大限度地提高了我的带宽,但q4312079q仍然不需要整个文件来开始播放。

它正在工作:



评论


也许应该使用mktemp --suffix = .mp4代替/tmp/vid.mp4,不是吗?

–脑袋
2014年10月12日23:26

@Braiam-这是一个很好的主意,但随后我可能不得不添加逻辑来进行清理。这样,至少它总是覆盖自己。尝试执行该文件的任何人都不会读取该文件,因此我不认为它是矢量-除非术语的gstreamer后端可以不小心在视频文件中运行可执行代码...也许。我对此表示怀疑,但我不足以肯定地说。无论如何,除非我另有说明,否则我总是希望它始终覆盖同一文件,但是如果我设法使它更好,例如尺寸选择等,我也一定会解决。

–mikeserv
2014-10-12 23:49

@Braiam-重做它-看看。接下来可能是专用的tmp dir / mktemp。

–mikeserv
2014年10月13日下午4:18

@Ramesh-再看一次。如果您使用的是最新版本,则更好。

–mikeserv
2014年10月13日在4:19

@DmitriDB-问题在于您根本不会在术语上打印这些转义符-这些将转为tmux的pty,因为tmux拥有这些介入pty的主端,而术语则拥有tmux的pty的主端。要处理它,您可以像... PTTY = $(tty)tmux ...然后在tmux会话中像... tybg>“ $ PTTY”。我实际上只是回答了您昨天才遇到的相同问题。上面的脚本应该以这种方式像ytplay ...>“ $ PTTY”一样工作。

–mikeserv
2014-12-21 20:43



#3 楼

youtube上有针对此的教程:

https://www.youtube.com/watch?v=QCuq0_nY3Xk

根据该视频,以下内容应该可以工作:

mplayer -cookies -cookies-file /tmp/cook.txt $(youtube-dl -g --cookies /tmp/cook.txt "https://www.youtube.com/watch?v=QCuq0_nY3Xk")


为此,您可以创建一个简单的函数:

playtube () {
mplayer -cookies -cookies-file /tmp/cook.txt $(youtube-dl -g --cookies /tmp/cook.txt "")
}


评论


这是我在计算机上得到的:paste.ubuntu.com/8527219

–IonicăBizău
2014年10月9日14:47

@IonicăBizău尝试:mplayer <(youtube-dl -o-“ https://www.youtube.com/watch?v=QCuq0_nY3Xk”)

–马丁·冯·维蒂奇(Martin von Wittich)
2014年10月9日15:13



@MartinvonWittich它正在工作,但不是ASCII视频,在终端中但在另一个窗口中...:-/

–IonicăBizău
2014年10月9日15:19

有人需要将其包装在一个程序中,该程序允许在终端中搜索youtube视频并将其标记为批量下载。然后再包装一次以剥离mp3并删除mp4。如果没有其他人可以在某个时候做,但是在接下来的几天中不会。

–米莉·史密斯(Millie Smith)
2014-10-9 15:19



@IonicăBizăumplayer会自动选择最佳的输出驱动程序,如果您正在运行Xorg,则可能会选择xv驱动程序。尝试将以下选项添加到mplayer以选择控制台ASCII艺术驱动程序:-vo caca。

–马丁·冯·维蒂奇(Martin von Wittich)
2014年10月9日15:23

#4 楼

来自https://github.com/mps-youtube/mps-youtube

sudo docker run --device /dev/snd -it --rm --name mpsyt rothgar/mpsyt