Youtube動画のAscii_Art風ターミナル表示CLIを実装してみた。#Rust

成果物

www.youtube.com

詳細情報

  • 日数: 4日
  • 言語: Rust
Crate Version
image 0.25.1
term_size 0.3.2
tokio 1.37.0
rusty_ytdl 0.7.1
FFmpeg 4.4.2
clap 4.5.4

技術選定

Rustを選んだ理由は、下記の理由です。
1. 似たソフトをPythonで実装している方がいたのですが、どうせなら別の言語で実装したかった。(Python経験ほぼ無いし...)
2. 読み書きのIO処理や繰り返し処理を多用するため、処理が早く・安全性が高い言語がいいのでは?と考えた。
3. 1番の理由はやっぱり、Rustが一番書いてて楽しかったから...(笑)

実装方法

  1. Youtubeから動画をダウンロードし、ファイルを読み込む。
  2. FFmpegを使用し、動画を画像フレーム&&グレースケール変換・ターミナルサイズに合わせ画像をリサイズする。
  3. フレームの明度ごとに文字を割り当て、繰り返し処理を使用してターミナルに表示する。

実装にあたってつまずいた部分

FFmpegのRust用Wrapper Crateを使用しようと思ったのですが、Buildにそもそも失敗し、 結局、うまくいかなかったためCommand::newで子プロセスとしてFFmpegを実行する方法に切り替えました。

再生中に、ノイズのようなものが表示されるのを解決できませんでした。

別の実装方法を考慮すべき点

24FPS処理のため、3分40秒の動画で220s*24fで5200枚程度の画像が生成される事になり、 ターミナルサイズが大きいほど解像度が高くなるため、綺麗に描画したい場合は、より容量が必要になります。
IO処理や繰り返し処理を多用しすぎた点も反省...

ソースコード

より良い実装方法ができる方は、是非教えてください! github.com