我正在寻找一种在终端中观看 YouTube 视频的方法(不是在浏览器或其他窗口中,而是在任何 bash 会话中)。
有没有一种简单的方法可以做到这一点?
我想象这样的事情:
$ youtube <video-url>
我已经知道如何使用以下方式播放视频mplayer
:
$ mplayer -vo caca local-file.avi
然而,这会打开一个新窗口。在终端上玩它会很酷。
此外,它应该与tmux
会话兼容。
我问了另一个问题如何防止打开新窗口。
对于那些想知道我在哪里需要这样的功能的人,我启动了一个名为的实验项目多路复用操作系统——这个概念是tmux
一切都应该在会话内运行 。
所以,我确实需要一个用于本地和远程视频的视频播放器。 :-)
答案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
然后您可以使用vlc
或mplayer
在本地观看这些内容:
$ 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 和放手 (Wayback Machine)这演示了我在聊天室中讨论的方法,主要用作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 视频可以得到进一步增强。
好的,但我想在我的实际终端中播放视频?
xterm
我发现了这个技巧,可以在 O'Reilly 的文章中播放视频,标题为:观看 ASCII 艺术视频。
$ 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 -"
这几乎有效!我不确定为什么视频不能在窗口中播放,但看起来应该可以。窗口出现并开始播放,但随后关闭。我只看到视频几秒钟,然后就什么也没有了。
也许上述内容会让您更接近最终的解决方案,或者可能只需要对选项进行一些调整。
附加库
如果您已经libcaca
安装了(彩色版本aalib
)并且将字体大小减小到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-terminal
&中运行xterm
。
笔记:即(从左到右)xterm
、terminator
、gnome-terminal
和terminology
。
答案2
所以,与术语 (顺便说一句,这可能是终端模拟器有史以来发生过的最好的事情) 在撰写本文时以下作品:
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
位是该行then
中的块。接受扩展终端转义,将媒体打印到屏幕上 - 有点像提示颜色,但也有高清视频和基本上任何你想要的东西。play()
printf \033}...
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 类型分配文件扩展名。
- 迄今为止- 无论是 webm 还是 mp4 - 第一个备用流是每个视频提供的最高质量 -通常720p .mp4 - 这就是我正在寻找的,所以这里没有选择其他的逻辑。不过,我最新的编辑添加了一些模块化/显式测试以使这成为可能。看这对于我最初编写该函数时引用的 perl 脚本。
- 提供了许多 - 如果您执行了上述操作,您将在引号分隔的字段
- 将
%[[:hexdigit:]]\{2\}
编码解析为工作链接。- 看这供我工作参考。
- 尝试下载该文件最多 5 次,并稍作退避。
- 默认情况下,该文件是,
/tmp/vid.${mime-type}
但如果ytplay
使用第二个参数调用,它会将其解释为目标下载文件名 - 同时仍根据 mime 类型附加扩展名。
- 默认情况下,该文件是,
- 如果在任何尝试之后下载目标的大小大于零,则允许下载在后台继续并
terminology
打印现在将媒体置于后台终端转义,否则它就会放弃并给您留下一条全部大写的错误消息。\033}bt[LINK/FILE]\0
用于全窗口播放。pn
会将其弹出到一个新窗口。还有其他用于在几何上限制游戏区域的方法,例如仅用于窗口的一部分。
这仅仅经历了一点多非常小测试,但到目前为止,除了一个之外,每个链接都有效,而且因为我实际上对观看没有播放的链接不感兴趣,所以我没有试图找出原因。
虽然它对所有人都有效,但并不一定玩每个 - 这是因为一开始我盲目地将.mp4
扩展名附加到目标文件而不检查它是否正确。可能我之前没有研究到的也只有这一点。无论如何,我改变了它来处理这个问题。
正如我之前提到的,唯一的terminology
具体位是在最后一个函数中 -play()
因此您可以轻松地更改它以对下载/下载的视频文件执行任何您想要的操作 - 例如mplayer
在另一个终端中将其与 CACA 库一起使用,或者将其弹出到vlc
窗口或其他任何地方。但如果你喜欢自己,你会以高清格式观看它terminology
。
哦,最后,这通常是非常快- 到目前为止,每次尝试时我的速度都已使带宽达到最大,但terminology
无论如何都不需要整个文件来开始播放。
这里它正在工作:
答案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 "$1")
}
答案4
从https://github.com/mps-youtube/mps-youtube
sudo docker run --device /dev/snd -it --rm --name mpsyt rothgar/mpsyt