Как стать автором
Обновить

Комментарии 34

Bad apple конечно легенда, и по мне, самое крутое воплощение было на осциллографе.

У вас, реализация - как просто попросить GPT покадрово разбить видео, перевести в ASCI и склеить. И код можно было бы и не писать.

Ну с GPT повторять мне особо не хотелось, потому что у меня уже года 2 были планы написать Bad apple ascii графикой, и портить это удовольствие халявой с нейросеткой я не хотел!

Я под линуксом видел видеопроигрыватели, которые итак могут проигрывать любое видео почти в ASCII-графике

Воу, это прикольная тема!

mplayer -vo caca

или mplayer -vo aa раньше

Спасибо, протестирую))

VLC это умеет лет 8, кажется.
VLC \ Preferences \ Video \ Output > Colour ASCII

Осциллоскоп это круто, но он лишь средство отображение, вся работа там делалась на обычном ПК. Мне больше понравился вариант на БК-0011М, хотя там тоже без современных средств не обошлось.

Да, автору респект за RISC-V на Logisim.

Мои 5 копеек в тему Bad Apple.

Hidden text

Bad Apple на ПЛИС ECP5 и светодиодной матрице HUB-75e

Хорооооош, легенда))

Моя реализация Bad Apple на LEGO EV3 Mindstorms

Ого! Вот это Вы крутой!!!))

Легендарное видео, мне оно тоже понравилось))

Отрыв башки. Как это сделано ? Как автор управляет загрузкой ядер да еще так динамично ?

Было предположение, по-моему даже здесь, на Хабре, что автор перехватывал вызовы WinAPI

Никак - он инжектит код в taskmanager и подменяет там данные.

Святые небеса... это и сюда попало. Даже на хабре меня преследует это плохое яблоко. Всю ленту в ютубе забило, так ещё и стало из ютуба выбираться... кто-нибудь знает, кто первый решил запустить плохое яблоко "на чём-то" и по какой такой волшебной причине это вдруг стало настолько популярным (запускать видоряд из оригинального видео на разных устрйоствах)? Я пытался найти ответ на этот вопрос и не смог. Никто не знает первоисточник и нулевого пациента.

В таком формате а-ля "дум, только из мира музыки", клип взлетел после того, как в 2010 кто-то сделал stop-motion версию (https://www.youtube.com/watch?v=240Vq6tIxio), которую потом показали на CNN (https://www.youtube.com/watch?v=OeEIteQmpHE).

Что интересно, я "Bad Apple!!" впервые увидел как раз на Хабре 10+ лет назад.

Если начать смотреть другой контент по Тохе, то "Bad Apple!!" постепенно пропадёт из выдачи )))

Это демосцена в лучшем смысле этого слова.

Для оптимизации используйте буфферизацию - рендерим все ASCII в буффер в размер кадра + 1 для символа переноса строки, и уже после рендера делаем

for line in buffer:
  sys.stdout.write(''.join(line))
  sys.stdout.flush()

А то и вовсе flush убрать из цикла и делать его единожды после цикла.

Как вариант - перейти в Raw Mode и передвигать курсор по терминалу при помощи управляющих последовательностей.

Спасибо за информацию, сейчас попробую улучшить код!

А ещё у этой песенки грустный текст, хотя вроде весёленько

У эмулятора терминала Windows, вроде, есть API, с помощью которого можно устанавливать символы на определённые строки и столбцы, тогда не нужно будет стирать, и вывод будет быстрее. Или просто выводить кадры, но не стирать вывод, так как следующий кадр уже захватывает всю видимую область терминала.

Мммм, звучит интересно, сейчас почитаю про это, спасибо за информацию!

Кто-то уже пытался составить каталог всех вариантов Bad Apple ?

Немного исправил код
import os
import sys
import time
import cv2
import numpy


os.system("title Bad Apple")
string = " `.,-':<>;+!*/?%&98#"
string = list(map(ord, string))
size = len(string)
coef = 256 / size
width = 480 // 3
height = 360 // 5
newline = numpy.array((ord("\n"),)*height, dtype="uint8")
cap = cv2.VideoCapture("img/BadApple.mp4")
start = time.time()
while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break
    frame = cv2.resize(frame, (width, height), interpolation=cv2.INTER_LINEAR)
    frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    frame = frame / coef
    frame = frame.astype("uint8")
    for i in range(size):
        frame[frame == i] = string[i]
    frame = numpy.column_stack((newline, frame))
    text = frame.tobytes().decode("ascii")
    sys.stdout.write(text)
    sys.stdout.flush()
    pos = cap.get(cv2.CAP_PROP_POS_MSEC) / 1000
    now = time.time()
    pause = pos - (now - start)
    if pause > 0:
        time.sleep(pause)
os.system("cls")
cap.release()

Чтобы в отображалось корректно необходимо установить размер окна 160x72

Получилось вот так

Огромное спасибо за исправления!!! Ваш код на порядок лучше моего он фиксит главный недостаток - мерцания!

Вставлю свои пять копеек:
Раз:
https://youtu.be/1Af9VKNOYsg
Благодаря использованию псевдографики (▚) разрешение по вертикали и горизонтали увеличено в два раза по ширине и высоте относительно количества столбцов и строк.

Два:
https://youtu.be/FO9yVdUYoPY
Здесь 5 градаций серого, опять же благодаря псевдографике (▓)

Недавно переписал на Go, вертеться стало гооораздо веселее)

НЛО прилетело и опубликовало эту надпись здесь
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории