在终端机上观看YouTube视频


107

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

有没有简单的方法可以做到这一点?

我想象这样的事情:

$ youtube <video-url>     

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

$ mplayer -vo caca local-file.avi

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

另外,它应该与tmux会话兼容。


我问了另一个问题,关于如何防止打开新窗口


对于那些想知道我在何处需要这种功能的人,我开始了一个名为TmuxOStmux的实验性项目,其概念是一切都应在会话中运行

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


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

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

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

有了mpv,您可以做到mpv <youtube url>。它也适用于许多其他视频网站。但这打开了一个新窗口。
Gerardo Marset 2014年

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

Answers:


132

您可以下载视频和/或仅下载音频,然后使用观看/收听它们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 -。这里有一个演示效果

          ss#1

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

               ss#2

可以,但是我想在实际的终端中播放视频吗?

xterm在O'Reilly题为“ 观看ASCII Art中的视频”的文章中找到了一种使视频可以在其中播放的技巧。

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

上面的操作会导致在xterm播放视频的窗口打开。

   ss#3

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

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

这几乎有效!我不确定为什么视频无法在窗口中播放,但似乎应该能够播放。窗口打开并开始播放,然后关闭。我看了一段短短的视频,然后什么都没有。

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

附加库

如果您已libcaca安装(的彩色版本aalib),并且将字体大小减小gnome-terminal到很小,例如3,则以下命令将直接在终端中显示看起来更好的ASCII视频:

$ CACA_DRIVER=ncurses mplayer -vo caca video.mp4

   ss#4

码头

对于是否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-terminal&中播放xterm

    蒙太奇

    注:这是(从左至右)xtermterminatorgnome-terminal,和terminology


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

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

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

3
所说的其他ASCII库是什么?
PythonNut 2014年

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

14

因此,在撰写本文时,术语学 (顺便说一句 ,这可能是终端仿真器发生的最好的事情),它的工作如下:

ytplay() ( 
    init() if     [ "${#1}" -gt 0 ] && i=$? du= f=
           then   durl \! \" \# \$ \% \& \' \( \) \* \
                       \+ \, \/ \: \; \= \? \@ \[ \]
                  : >"${f:=${2:-/tmp/vid}.$(
                      durl "$1" 's/.*mime=[^/]*.\([^&]*\).*/\1/'
                  )}"
                  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 "$1" | { 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 '\033}bt%s\0' "$f"; exit
           fi
    while init "$@" || exit
    do    curl -s "$(durl "$1")" >"$f" & pid=$!
    done  3>&2 2>/dev/null
)

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

剩下的就是一些curl | sed脚本:

  1. 接受常规的youtube链接作为第一个参数...
    • ytplay 'https://www.youtube.com/watch?v=${id}' 等等...
  2. 拉取HTML并找到备用下载流的相关javascript代码...
    • curl "$yturl" | grep url_encoded_fmt_stream_map看到整个街区。
  3. 从该块中,它选择第一个提供的备用流。
    • 提供了很多-如果您执行grep上述操作,您会在"引号分隔的...stream_map: "字段中找到列表。
    • 一开始我以为我只会越来越多地得到mp4,也越来越多地得到webms。因此,我对其进行了编辑,以实现顺畅,并按mime类型分配文件扩展名。
    • 到目前为止 -无论是webm还是mp4-第一个备用流是每个视频提供的最高质量- 通常是 720p .mp4-这是我一直在寻找的内容,因此这里没有选择其他逻辑。我的最新编辑添加了一些模块化/显式测试,以实现这一目标。见对perl脚本时原本写的功能我引用。
  4. %[[:hexdigit:]]\{2\}编码解析为工作链接。
    • 请参阅此内容作为我的工作参考。
  5. 尝试将文件下载多达5次,但有一点退缩。
    • 默认情况下,该文件为,/tmp/vid.${mime-type}但是如果ytplay使用第二个参数调用该文件,它将解释为目标下载文件名-同时仍根据mime类型附加扩展名。
  6. 如果下载的目标是在一个大小大于零以下的任何尝试它允许下载,继续在后台打印terminology地方媒体在后台,现在终端逃生,否则它只是放弃并离开你的错误信息所有大写。
    • \033}bt[LINK/FILE]\0进行全窗口播放。pn会弹出一个新窗口。还有其他一些几何上限制游戏区域的方法-例如仅针对一部分窗口。

这项测试仅进行了非常少量的测试,但到目前为止,它对于每个链接都可以正常工作,而且只有一个-而且因为我实际上对观看未播放的链接并不感兴趣,所以我没有尝试找出为什么。

虽然它对所有文件都有效,但并不一定要每个文件都播放 -这是因为起初我盲目将.mp4扩展名附加到目标文件中,而没有检查它是否正确。我以前没看过的那个可能也是这个。无论如何,我都将其更改为可以处理。

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

哦,最后,这通常非常快 -到目前为止,我的速度在每次尝试期间都已达到最大带宽,但是terminology无论如何都不需要整个文件开始播放。

它在这里工作:

术语岩石


1
而不是/tmp/vid.mp4也许应该使用mktemp --suffix=.mp4,不是吗?
Braiam 2014年

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

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

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

1
@DmitriDB -问题是,你不打印这些转义符,以terminology在所有-那些打算tmuxpty,因为tmux拥有那中间的主端ptyS和terminology拥有的主端tmuxpty。要处理,你可以这样做...... PTTY=$(tty) tmux ...然后在tmux类似会议... tybg >"$PTTY"。其实我刚才已经回答你有同样的问题在这里就在昨天。上面的脚本应该ytplay ... >"$PTTY"以这种方式像在多路复用器中一样工作。
mikeserv 2014年

6

在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 "$1")
}

这是我得到我的机器上:paste.ubuntu.com/8527219
尼卡比曹

1
@IonicăBizău尝试:mplayer <(youtube-dl -o - "https://www.youtube.com/watch?v=QCuq0_nY3Xk")
Martin von Wittich 2014年

@MartinvonWittich它的工作,但它不是ASCII视频在终端,但在另一个窗口...: - /
尼卡比曹

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

@IonicăBizău mplayer自动选择最佳的输出驱动程序,如果您正在运行Xorg,则可能会选择xv驱动程序。尝试添加以下选项以mplayer选择控制台ASCII美工驱动程序:-vo caca
Martin von Wittich 2014年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.