터미널에서 YouTube 동영상 시청


107

터미널 (브라우저 또는 다른 창이 아니라 bash 세션에서)에서 YouTube 비디오를 볼 수있는 방법을 찾고 있습니다.

이를 수행하는 간단한 방법이 있습니까?

나는 이와 같은 것을 상상한다 :

$ youtube <video-url>     

이미 mplayer다음을 사용하여 비디오를 재생하는 방법을 알고 있습니다 .

$ mplayer -vo caca local-file.avi

그러나 새 창이 열립니다. 터미널에서 재생하는 것이 좋습니다.

또한 tmux세션 과 호환되어야 합니다.


새 창을 열지 못하게하는 방법에 대해 다른 질문을했습니다 .


어디에서 이러한 기능이 필요한지 궁금해하는 사람들을 위해 모든 것이 세션 내에서 실행되어야한다는 개념으로 TmuxOStmux 라는 실험 프로젝트를 시작했습니다 .

따라서 로컬 및 원격 비디오를위한 비디오 플레이어가 필요합니다. :-)


2
이런 말인가요? google.com/…
혼돈

1
@chaos 정확히. :-) 나는 이것을 몇 달 동안 찾고 있지만 아직 아무것도 찾지 못했습니다. 여기에 요청하기로 결정했습니다
Ionică Bizău

VLC는 터미널 출력 기능이 있는지 확실하지 않은 유튜브 비디오를 재생할 수 있습니다.

mpv로 할 수 있습니다 mpv <youtube url>. 다른 비디오 사이트에서도 작동합니다. 그러나 이것은 새로운 창을 엽니 다.
Gerardo Marset

1
이것은 매혹적인 질문이며, 나는 대답에서 많은 것을 배웠습니다. 그러나 호기심에서-왜 지구상에서 이것을해야합니까? ;-)
Digital Trauma

답변:


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

그런 다음 사용할 수 있습니다 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"

OK. 그러나이 비디오가 ASCII로 스트리밍 될 때보 고 싶습니다.

이 블로그 기사는 ascii, youtube 및 letting 이라는 제목으로 채팅방에서 논의한 방법을 보여줍니다. 주로 youtube-dlYouTube 스트림을 다운로드 한 다음 다른 앱으로 리디렉션 할 수있는 "백엔드"로 사용 합니다.

이 기사에서는 다음을 수행합니다 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

그래도 실제 터미널에서 비디오를 원합니까?

xtermO'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-terminal3 말처럼, 다음 명령을 직접 터미널에서 훨씬 더 나은 찾고 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에서도 재생할 수 있습니다.

    ss 몽타주

    참고 : 그 (왼쪽에서 오른쪽)의 xterm, terminator, gnome-terminal,와 terminology.


2
terminologycaca 라이브러리가 아닌- 에서 재생할 수 있습니다 . 터미널 이스케이프를 사용하여 3 항식 창의 매핑 된 부분을 지정하고 고화질로 바로 재생할 수 있습니다. 비디오를 배경으로 설정하고 작업 할 수도 있습니다. terminologyURI도 이해합니다-유튜브 비디오에 대한 링크 링크와 printf터미널 프롬프트처럼 화면에 링크하십시오 .
mikeserv

@ mikeserv-그 터미널 에뮬레이터에 대해 들어 본 적이 없습니다. 나는 그것을 시도했고 백그라운드에서 비디오를 재생할 수 있다는 것이 멋지다 tybg my.avi.
slm

예- printf방법이 더 좋습니다. 수행 tybg somefile | sed -n l작동 방식을 볼 수 - 그것은 단지 확장 터미널 이스케이프를 사용합니다. 그들은 man페이지에 문서화되어 있습니다. 당신도 같은 작업을 수행 할 수 있습니다 ty{ls,cat}. 그러나 그 작은 응용 프로그램은 실제의 오래된 데모 래퍼이며 아마도 가능하지 않을 수도 있습니다. 어쨌든, 귀하의 버전이 지난 몇 개월 동안 제작 되었다면, ctrl + shift + h와 같이 미니 뷰를 좋아할 것입니다. 모든 깨달음은 거의 훌륭합니다. 그래서 최근에 시도해 보라고 제안했습니다. 또한 미친 듯이 빠릅니다.
mikeserv

3
추가 ASCII 라이브러리는 무엇입니까?
PythonNut

1
@ slm이 너무 나쁘다. 데브 멀티미디어 빌드 만 가능하다고 생각한다. 왜 다른 사람들이 그렇지 않은지 궁금해 할 것입니다.
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특정 비트는이다 then의 블록 play()더 - printf \033}...라인. terminology프롬프트 색상과 같은 화면에 미디어를 인쇄하기위한 확장 된 터미널 이스케이프를 허용합니다.

나머지는 다음과 같은 약간의 curl | sed스크립트입니다.

  1. 첫 번째 인수로 일반 YouTube 링크를 허용합니다 ...
    • ytplay 'https://www.youtube.com/watch?v=${id}' 등등...
  2. HTML을 가져 와서 대체 다운로드 스트림에 대한 관련 자바 스크립트 코드를 찾습니다.
    • 이렇게 curl "$yturl" | grep url_encoded_fmt_stream_map전체 블록을 볼 수 있습니다.
  3. 해당 블록 내에서 첫 번째 제안 된 대체 스트림을 선택합니다.
    • 많은 것들이 제공됩니다- grep위 의 작업을 수행 한 경우 "따옴표로 구분 된 ...stream_map: "필드에 목록이 있습니다.
    • 처음에는 mp4를 점점 더 많이 얻을 것이라고 생각했지만 webms도 얻었습니다. 흐름을 위해 편집하고 mime 유형별로 파일 확장자를 할당했습니다.
    • 지금까지 - WEBM 또는 MP4 여부 - 첫번째로 대체 스트림 비디오마다 제공하는 최고의 품질입니다 - 보통 720 .MP4 - 어쨌든 찾고 있어요 그래서 어떤 논리가 다른 사람을 선택 여기가 없습니다 것이다. 내 최신 편집에는 이것을 가능하게하기 위해 모듈성 / 명시 적 테스트가 추가되었습니다. 원래 함수를 작성할 때 참조한 perl 스크립트에 대해서는 내용을 참조하십시오 .
  4. %[[:hexdigit:]]\{2\}인코딩을 작업 링크로 구문 분석합니다 .
    • 내 작업 참조를 위해 이것을 참조하십시오 .
  5. 약간의 백오 프로 파일을 최대 5 회 다운로드하려고합니다.
    • 기본적으로 파일은 /tmp/vid.${mime-type}있지만 ytplay두 번째 인수와 함께 호출 되면 mime 유형에 따라 확장명을 추가하면서 대상 다운로드 파일 이름으로 해석합니다.
  6. 다운로드 목표는 시도의 다음 0보다 큰 크기 인 경우는 다운로드가 백그라운드에서 계속 할 수 있습니다 인쇄 terminology장소 미디어 배경 현재의 터미널 탈출, 그렇지 않으면 그냥 포기하고 모든 오류 메시지를 남긴다 모자에.
    • \033}bt[LINK/FILE]\0전체 창 재생. pn새 창으로 튀어 나옵니다. 재생 영역을 기하학적으로 제한하는 다른 방법도 있습니다 (예 : 창의 일부에만 해당).

이 테스트는 최소한의 테스트 를 거쳤 지만 지금까지 모든 링크에 대해 실패하지 않고 하나만 작동했습니다. 실제로 플레이하지 않은 링크를 보는 데 관심이 없었기 때문에 알아 내려고 시도하지 않았습니다. 왜.

그것이 모두 그들에게 효과가 있었지만, 반드시 각각을 연주 하지는 않았습니다. 이것은 처음에 .mp4확장자를 대상 파일에 맹목적으로 정확하게 추가했는지 확인하지 않고 추가했기 때문 입니다. 내가 전에 보지 않은 것이 이것뿐 일 수도 있습니다. 어쨌든 나는 그것을 처리하도록 변경했습니다.

앞서 언급했듯이, 유일한 terminology특정 비트는 가장 마지막 기능입니다. play()따라서 mplayer다른 터미널의 CACA 라이브러리 와 함께 사용하는 것과 같이 다운로드 / 다운로드 한 비디오 파일로 원하는 작업을 수행하도록 쉽게 변경할 수 있습니다 . 그렇지 않으면 vlc창 이나 그 밖의 것에 튀어 나옵니다 . 그러나 당신이 자신을 좋아한다면에서 고화질로 볼 수 terminology있습니다.

아, 그리고 마지막으로, 이것은 일반적으로 매우 빠릅니다 . 내 속도는 모든 시도에서 지금까지 지속 시간 동안 대역폭을 최대로 늘 렸지만 terminology파일을 재생하기 위해 전체 파일이 필요하지는 않습니다.

여기서 작동합니다.

용어 바위


1
/tmp/vid.mp4아마 대신 에을 사용해야합니다 mktemp --suffix=.mp4.
Braiam

@Braiam-그것은 좋은 생각이지만 정리를 위해 논리를 추가해야 할 것입니다. 이런 식으로 적어도 그것은 항상 자신을 덮어 씁니다. 하지 않는 한 -이 파일을 실행하고 그래서 그것을 벡터 고려하지 않는 시도 아무것도 읽을되지 않습니다 terminology님의 ' gstreamer백엔드 실수 어쩌면 ... 비디오 파일의 실행 코드를 실행할 수 있습니다. 의심하지만 확실하게 말할 수는 없습니다. 어쨌든, 나는 달리 말하지 않는 한 항상 같은 파일을 덮어 쓰는 것을 선호하지만 크기 선택과 같은 더 나은 파일로 만들면 분명히 그것을 고칠 것입니다.
mikeserv

@Braiam-재 작업했습니다. 아마도 전용 tmp dir / mktemp가 다음에있을 것입니다.
mikeserv

@Ramesh-다시보십시오. 마지막 버전을 사용한 경우이 방법이 더 좋습니다.
mikeserv

1
@DmitriDB은 - 문제는 당신에 그 탈출을 인쇄하지 않을 것을 terminology전혀 - 사람들은 건가요 tmux'들 pty때문에 tmux그 개입의 마스터 측 소유 pty들과 terminology의 마스터 측 소유 tmux의를 pty. 당신이 ... 같이 할 수있는 처리하려면 PTTY=$(tty) tmux ...다음에 tmux... 같은 세션 tybg >"$PTTY". 나는 실제로 당신이 어제 여기에서 겪었던 것과 동일한 문제에 대답했습니다 . 위의 스크립트 ytplay ... >"$PTTY"는 멀티플렉서 내 에서처럼 작동 합니다.
mikeserv

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
Ionică Bizău

1
@ IonicăBizău 시도 :mplayer <(youtube-dl -o - "https://www.youtube.com/watch?v=QCuq0_nY3Xk")
마틴 폰 Wittich

@MartinvonWittich 그것은 작동하지만 터미널에서 다른 창에 ASCII 비디오가 아닙니다 ... :-/
Ionică Bizău

2
누군가 터미널에서 youtube 비디오를 검색하고 배치 다운로드를 표시 할 수있는 프로그램으로 이것을 포장해야합니다. 그런 다음 한 번 더 감싸서 mp3를 벗기고 mp4를 삭제하십시오. 다른 사람이 없으면 언젠가는 할 수 있지만 앞으로 며칠이 지나지 않을 것입니다.
Millie Smith

@ IonicăBizău는 mplayer자동으로 최상의 출력 드라이버를 선택하고 Xorg를 실행중인 경우 xv드라이버를 선택합니다 . mplayer콘솔 ASCII 아트 드라이버를 선택 하려면 다음 옵션을 추가하십시오 -vo caca..
Martin von Wittich

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.