在終端中觀看 YouTube 視頻

在終端中觀看 YouTube 視頻

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

然後您可以使用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 和放手 (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 -。有一個效果演示在這裡

          SS#1

透過安裝附加庫,可以進一步增強 ASCII 視訊。

               SS#2

好的,但我想在我的實際終端中播放影片?

xterm我發現了這個技巧,可以在 O'Reilly 的文章中播放視頻,標題為:觀看 ASCII 藝術視頻

$ 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-terminalterminology

答案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腳本:

  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無論如何都不需要整個檔案來開始播放。

這裡它正在工作:

術語岩石

答案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

相關內容