Xem video YouTube trong thiết bị đầu cuối


107

Tôi đang tìm cách để xem video YouTube trong thiết bị đầu cuối (không phải trong trình duyệt hoặc cửa sổ khác, nhưng ngay tại đó, trong bất kỳ phiên bash nào).

Có một cách đơn giản để làm điều này?

Tôi tưởng tượng một cái gì đó như thế này:

$ youtube <video-url>     

Tôi đã biết cách phát video bằng cách sử dụng mplayer:

$ mplayer -vo caca local-file.avi

Tuy nhiên, điều này mở ra một cửa sổ mới. Nó sẽ được mát mẻ để chơi nó trong thiết bị đầu cuối.

Ngoài ra, nó phải tương thích với tmuxcác phiên.


Tôi hỏi một câu hỏi khác về cách ngăn chặn mở một cửa sổ mới .


Đối với những người thắc mắc rằng tôi cần một chức năng như vậy, tôi đã bắt đầu một dự án thử nghiệm có tên TmuxOS - với khái niệm rằng mọi thứ sẽ chạy bên trong một tmuxphiên .

Vì vậy, thực sự tôi cần một trình phát video cho các video địa phương và từ xa. :-)


2
Bạn có nghĩa là như thế này? google.com/ từ
hỗn loạn

1
@chaos Chính xác. :-) Tôi đang tìm kiếm cái này trong nhiều tháng, nhưng vẫn chưa tìm thấy gì. Quyết định hỏi tại đây ...
Ionică Bizău

VLC có thể phát video Youtube, không chắc nó có khả năng đầu ra hay không.

Với mpv bạn có thể làm được mpv <youtube url>. Nó cũng hoạt động cho một loạt các trang web video khác. Nhưng điều này mở ra một cửa sổ mới.
Gerardo Marset

1
Đây là một câu hỏi hấp dẫn và tôi đã học được rất nhiều từ các câu trả lời. Nhưng vì tò mò - tại sao bạn cần phải làm điều này? ;-)
Chấn thương kỹ thuật số

Câu trả lời:


132

Bạn có thể tải xuống video và / hoặc chỉ âm thanh và sau đó xem / nghe chúng bằng cách sử dụng youtube-dl. Kịch bản được viết bằng Python và sử dụng ffmpegTôi tin.

$ 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)
...
...

Để tải xuống video, bạn chỉ cần cung cấp cho URL từ trang bạn muốn video và tập lệnh thực hiện phần còn lại:

$ 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

Sau đó, bạn có thể sử dụng vlchoặc mplayerđể xem những địa phương này:

$ 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 nhưng tôi muốn xem những video này khi chúng được phát trực tuyến & trong ASCII

Tôi tìm thấy bài viết trên blog này có tiêu đề: Trên ascii, youtube và cho phép trình bày phương pháp mà tôi đã thảo luận trong phòng chat, chủ yếu sử dụng youtube-dllàm "phụ trợ" có thể thực hiện tải xuống luồng YouTube và sau đó chuyển hướng nó sang một ứng dụng khác.

Bài viết này cho thấy nó đang được thực hiện với mplayer:

$ youtube-dl http://www.youtube.com/watch?v=OC83NA5tAGE -o - | \
    mplayer -vo aa -monitorpixelaspect 0.5 - 

Video đang được tải xuống youtube-dlđược chuyển hướng qua STDOUT ở trên , -o -. Có một bản demo của hiệu ứng ở đây .

          ss # 1

Với việc cài đặt các thư viện bổ sung, video ASCII có thể được tăng cường hơn nữa.

               ss # 2

OK nhưng tôi muốn video trong thiết bị đầu cuối thực tế của tôi?

Tôi đã tìm thấy thủ thuật này cho phép phát video trong một đoạn xtermtrong O'Reilly có tiêu đề: Xem video trong Nghệ thuật ASCII .

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

Các kết quả trên trong một xtermcửa sổ đang được mở nơi video phát.

   ss # 3

Vì vậy, tôi nghĩ, tại sao không đặt bơ đậu phộng và sô cô la như thế này:

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

Điều này gần như hoạt động! Tôi không chắc tại sao video không thể phát trong cửa sổ, nhưng có vẻ như nó sẽ có thể. Cửa sổ bật lên và bắt đầu chơi nhưng sau đó đóng lại. Tôi thấy video trong vài giây và sau đó không có gì.

Có lẽ những điều trên sẽ giúp bạn tiến gần hơn đến giải pháp cuối cùng của mình, hoặc có lẽ nó chỉ cần được điều chỉnh một chút về các tùy chọn.

Thư viện bổ sung

Nếu bạn đã libcacacài đặt (phiên bản được tô màu của aalib) và bạn giảm kích thước phông chữ của mình gnome-terminalthành một cái gì đó thực sự nhỏ, như nói 3, lệnh sau sẽ hiển thị video ASCII trông đẹp hơn trực tiếp trong thiết bị đầu cuối:

$ CACA_DRIVER=ncurses mplayer -vo caca video.mp4

   ss # 4

Thiết bị đầu cuối

Dường như việc lựa chọn thiết bị đầu cuối có thể tạo ra một vấn đề lớn về việc liệu mplayercó thể phát trực tiếp bên trong thiết bị đầu cuối hay liệu nó có mở một cửa sổ riêng biệt hay không. Bộ nhớ đệm cũng mplayertạo ra sự khác biệt lớn trong việc có thể phát trực tiếp trong các thiết bị đầu cuối.

Sử dụng lệnh này tôi đã có thể phát terminator, ít nhất là cho 1/4 đầu tiên của video trước khi nó bị cắt:

$ youtube-dl http://www.youtube.com/watch?v=OC83NA5tAGE -o - | \
    mplayer -cache 32767 -vo aa:driver=curses -

Phiên bản màu đã sử dụng lệnh này:

$ youtube-dl http://www.youtube.com/watch?v=OC83NA5tAGE -o - | \
    CACA_DRIVER=ncurses mplayer -cache 64000 -vo caca -

Những lệnh tương tự có thể chơi trong gnome-terminal& xtermquá.

    dựng phim ss

    LƯU Ý: Đó là (từ trái sang phải) xterm, terminator, gnome-terminal, và terminology.


2
Bạn có thể chơi nó trong terminology- và không chỉ w / the caca libs. Bạn có thể sử dụng lối thoát thiết bị đầu cuối để chỉ định một phần được ánh xạ của cửa sổ terninal và chơi nó ngay ở độ phân giải cao. Bạn thậm chí có thể đặt video thành nền của bạn và xử lý nó. terminologycũng hiểu URI - nhận một liên kết webm tới video youtube của bạn và chỉ cần printfnó đến màn hình như một dấu nhắc thiết bị đầu cuối.
mikeerv

@mikeerv - Thật tuyệt, chưa bao giờ nghe nói về trình giả lập thiết bị đầu cuối đó. Tôi đã thử nó và thật tuyệt khi bạn có thể phát video ở chế độ nền tybg my.avi.
slm

Vâng - tôi thích printfphương pháp này. Làm tybg somefile | sed -n lđể xem làm thế nào nó hoạt động - nó chỉ sử dụng thoát thiết bị đầu cuối mở rộng. Chúng được ghi lại trong mantrang. Bạn có thể làm tương tự với ty{ls,cat}. Nhưng những ứng dụng nhỏ đó chỉ là các trình bao bọc demo cũ của thực tế và có thể không có khả năng. Dù sao, nếu phiên bản của bạn đã được xây dựng trong vài tháng qua, bạn có thể thích miniview nhiều như tôi - làm ctrl + shift + h. Tất cả sự giác ngộ là khá tốt - đó là lý do tại sao tôi đề nghị bạn thử nó gần đây. Nó cũng điên nhanh.
mikeerv

3
Các libs ASCII bổ sung đã nói là gì?
PythonNut

1
@slm quá tệ, tôi đoán chỉ các bản dựng đa phương tiện đã kích hoạt nó. Tự hỏi tại sao những người khác không, đoán có lẽ họ coi libcaca là một trò đùa và phình to.
derobert

14

Vì vậy, với Thuật ngữ (có lẽ là điều tốt nhất từng xảy ra với trình giả lập thiết bị đầu cuối, nhân tiện) tại thời điểm viết bài này , các tác phẩm sau:

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
)

Các terminologybit cụ thể là thenkhối trong play()- printf \033}...dòng. terminologychấp nhận thoát thiết bị đầu cuối mở rộng để in phương tiện truyền thông lên màn hình - giống như màu sắc nhanh chóng nhưng cũng là video hi-def và về cơ bản là bất cứ điều gì bạn muốn.

Phần còn lại là một chút curl | sedkịch bản:

  1. Chấp nhận một liên kết youtube thông thường làm đối số đầu tiên của nó ...
    • ytplay 'https://www.youtube.com/watch?v=${id}' và v.v.
  2. Kéo HTML và tìm mã javascript có liên quan cho các luồng tải xuống thay thế ...
    • làm curl "$yturl" | grep url_encoded_fmt_stream_mapđể xem toàn bộ khối.
  3. Từ trong khối đó, nó chọn luồng thay thế được cung cấp đầu tiên.
    • nhiều thứ được cung cấp - nếu bạn đã làm như greptrên, bạn sẽ tìm thấy danh sách trong trường "được phân tách bằng trích dẫn ...stream_map: ".
    • trong khi ban đầu tôi nghĩ rằng tôi sẽ chỉ nhận được mp4 và ngày càng nhiều hơn, tôi cũng nhận được webms. Vì vậy, tôi đã chỉnh sửa nó cho luồng và chỉ định phần mở rộng tệp theo loại mime.
    • cho đến nay - dù là webm hay mp4 - luồng thay thế đầu tiên là chất lượng cao nhất được cung cấp cho mỗi video - thường là 720p .mp4 - đó là những gì tôi đang tìm kiếm và vì vậy không có logic nào ở đây để chọn người khác. Chỉnh sửa mới nhất của tôi đã thêm một số thử nghiệm mô-đun / rõ ràng để làm điều này có thể, mặc dù. Xem phần này cho tập lệnh perl mà tôi đã tham chiếu khi viết hàm ban đầu.
  4. Phân tích %[[:hexdigit:]]\{2\}mã hóa thành các liên kết làm việc.
    • Xem này để tham khảo làm việc của tôi.
  5. Cố gắng tải xuống tệp tối đa 5 lần với một chút backoff.
    • Theo mặc định, tệp là /tmp/vid.${mime-type}nhưng nếu ytplayđược gọi với đối số thứ hai, nó sẽ hiểu đó là tên tệp tải xuống được nhắm mục tiêu - trong khi vẫn nối thêm phần mở rộng theo loại mime.
  6. Nếu mục tiêu tải về là một kích thước lớn hơn không sau bất kỳ cố gắng của nó cho phép tải về để tiếp tục ở chế độ nền và in terminology's vị trí phương tiện truyền thông trong nền tại terminal thoát, ngược lại nó chỉ cho phép lên và để lại cho bạn một thông báo lỗi tất cả trong mũ.
    • \033}bt[LINK/FILE]\0để chơi toàn cửa sổ. pnsẽ bật nó ra một cửa sổ mới. Có những cái khác để giới hạn hình học khu vực chơi - chẳng hạn như chỉ cho một phần của cửa sổ.

Điều này đã trải qua chỉ hơn một chút so với thử nghiệm rất tối thiểu , nhưng cho đến nay vẫn hoạt động cho mọi liên kết mà không bị lỗi - và vì tôi thực sự không thích xem một liên kết không chơi nên tôi đã không thử tìm hiểu tại sao.

Mặc dù nó hoạt động cho tất cả chúng, nhưng nó không nhất thiết phải chơi từng cái - và điều này là do lúc đầu tôi mù quáng nối thêm .mp4phần mở rộng vào tệp mục tiêu mà không kiểm tra xem nó có đúng không. Có thể cái mà tôi không nhìn vào trước đây chỉ là cái này. Trong mọi trường hợp, tôi đã thay đổi nó để xử lý điều đó.

Như tôi đã đề cập trước đó, terminologybit cụ thể duy nhất nằm ở chức năng cuối cùng - play()- và do đó bạn có thể dễ dàng thay đổi điều đó để làm bất cứ điều gì bạn muốn với tệp video tải xuống / tải xuống - chẳng hạn như sử dụng nó với mplayerlib CACA trong thiết bị đầu cuối khác, hoặc khác bật nó ra vào một vlccửa sổ hoặc bất cứ điều gì. Nhưng nếu bạn thích chính mình, bạn sẽ xem nó trong hi-def in terminology.

Ồ, và cuối cùng, điều này thường rất nhanh - tốc độ của tôi đã tăng tối đa băng thông trong suốt thời gian cho đến nay trên mọi nỗ lực, nhưng dù terminologysao cũng không cần toàn bộ tệp để bắt đầu phát.

Ở đây nó đang hoạt động:

thuật ngữ đá


1
Thay vì /tmp/vid.mp4có lẽ bạn nên sử dụng mktemp --suffix=.mp4, không?
Braiam

@Braiam - đó là một ý tưởng rất hay, nhưng sau đó có lẽ tôi phải thêm logic để dọn dẹp. Theo cách này ít nhất nó luôn ghi đè lên chính nó. Các tập tin không bao giờ được đọc bởi bất cứ điều gì mà cố gắng để thực hiện nó và vì vậy tôi không coi đó là một vector - trừ khi terminology's gstreamerbackend vô tình có thể chạy mã thực thi trong một tập tin video ... Có lẽ. Tôi nghi ngờ điều đó, nhưng tôi không đủ để nói chắc chắn. Dù sao, tôi thích nó luôn luôn viết trên cùng một tập tin trừ khi tôi nói khác, nhưng nếu tôi đi xung quanh để làm cho nó tốt hơn - như chọn kích thước và như vậy - tôi chắc chắn cũng sẽ sửa nó.
mikeerv

@Braiam - làm lại nó - có một cái nhìn. Có lẽ là một tmp dir / mktemp chuyên dụng là tiếp theo.
mikeerv

@Ramesh - nhìn lại. Nếu bạn đã sử dụng phiên bản cuối cùng, điều này là tốt hơn.
mikeerv

1
@DmitriDB - vấn đề là bạn không in những thoát để terminologyở tất cả - những người sẽ tmux's ptytmuxsở hữu mặt bậc thầy của những can thiệp ptys và terminologysở hữu các mặt bậc thầy của tmux' s pty. Để xử lý mà bạn có thể làm như ... PTTY=$(tty) tmux ...sau đó trong tmuxphiên như ... tybg >"$PTTY". Tôi thực sự chỉ trả lời cùng một vấn đề bạn gặp ở đây chỉ ngày hôm qua. Kịch bản ở trên chỉ hoạt động như ytplay ... >"$PTTY"trong một bộ ghép kênh theo cách đó.
mikeerv

6

Có hướng dẫn cho điều này trên youtube:

https://www.youtube.com/watch?v=QCuq0_nY3Xk

Theo video đó, những điều sau đây nên hoạt động:

mplayer -cookies -cookies-file /tmp/cook.txt $(youtube-dl -g --cookies /tmp/cook.txt "https://www.youtube.com/watch?v=QCuq0_nY3Xk")

Bạn có thể tạo một chức năng đơn giản cho mục đích này:

playtube () {
mplayer -cookies -cookies-file /tmp/cook.txt $(youtube-dl -g --cookies /tmp/cook.txt "$1")
}

Đây là những gì tôi nhận được trên máy của mình: paste.ubfox.com/8527219
Ionică Bizău

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

@MartinvonWittich Nó hoạt động, nhưng đó không phải là video ASCII, trong thiết bị đầu cuối mà ở một cửa sổ khác ...: - /
Ionică Bizău

2
Ai đó cần phải bọc cái này trong một chương trình cho phép tìm kiếm video youtube trong thiết bị đầu cuối và đánh dấu chúng để tải xuống hàng loạt. và sau đó bọc nó thêm một lần nữa để tách mp3 và xóa mp4. Tôi có thể làm điều đó vào một lúc nào đó nếu không có ai làm điều đó, nhưng nó sẽ không có trong vài ngày tới.
Millie Smith

@ IonicăBizău mplayertự động chọn trình điều khiển đầu ra tốt nhất và nếu bạn có Xorg đang chạy, nó có thể sẽ chọn xvtrình điều khiển. Hãy thử thêm tùy chọn sau mplayerđể chọn trình điều khiển nghệ thuật ASCII của bàn điều khiển : -vo caca.
Martin von Wittich

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.