我正在尋找一種在終端機中觀看 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