自作のffmpegフロントエンド　”はるあこんば~た”


宣伝記事です。

自作のffmpegフロントエンド はるあこんば~たを公開しています。
要はよくある動画変換アプリです。


https://sheephuman.hatenablog.com/entry/HaruaConvert

Googleドライブ
https://drive.google.com/file/d/1fQts-JsbM0XfmbAtRJ5-PiNymYHyk945/view

github 
https://github.com/Sheephuman/HaruaConvert

Vector
https://www.vector.co.jp/soft/winnt/art/se526021.html

# アプリ外観（調整中）
システムフォントのサイズが違う環境だと見切れるらしいので検証中です。　
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145714/d0a139dd-7c42-9c6a-8e42-d68b68929efa.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145714/1d297932-ec79-5bd6-db18-64ee8004fa1e.png)


### コード公開
Gitサービスに上げるにはMVVMパターンとかBindingとか色々と無視して実装を推し進めたので、段階的に取り入れたうえで上げる予定です。

 クラス設計も○○Manager的なモノがなくイマイチで、変数管理にDDD的な要素を取り入れてかろうじてドメイン的な管理をしているという態です。

　→Code見て何を言われようがどうでもいいんだけど、合理性があったら改善も考えてますしやっぱり必要だとは常々思ってる。

### git公開（暫定）

レビューするのは勝手だけど基本的に自分のやりたいようにやります。
出来ればNeeViewと同じサービスに上げたい。

https://github.com/Sheephuman/HaruaConvert


```powershell
git clone https://github.com/Sheephuman/HaruaConvert.git
```

使い方は少しずつ覚える。


# 開発履歴
 Git化すれば使わなくなるかもしれない。多分。

https://qiita.com/EndOfData/items/9e7f72210800326eba61



 # ここが便利だよという点

 1\. 最新のFFmpeg(5.12)を同梱してるので速い。
　ビルドしたffmpegのファイルサイズの肥大化が解決しておらず、引き続き他の方法でビルド検証作業中です。-Nonfreeとか-unable-GPLとか付けて再配布します。公式配布並みのファイルサイズ（200kbぐらい）が目標。


2\. ffmpegに渡すパラメーターを好きに弄れる
　同種の動画変換アプリにはない特徴です。ffmpeg使ってるのにクソ重くて変換が遅いフリーソフトとか結構ありますけど、このソフト（というかffmpeg）はとても高速です（当たり前ですけどマシンスペック次第なので悪しからず）


3\.gif変換とか動画の切り出しなんかも出来る
　独自の書式により、gif変換や動画のjpeg抽出、指定の時間まで切り出しなんかが手軽に行えます。

　現在配布中のものはBeta版なので（後出し）ちょっと不便な点もあると思いますが、近い内に調整した上でGitやVector等に上げます。


4\.パラメータを複数保存しておける
　配布中のものは6個ぐらいしか保存しておけませんが、開発中のものは**100個まで保存出来ますし、保存できる数はユーザーの任意指定可能です**(そんなに必要なのかどうかはさておき)。ちょっと見た目の調整が終わってないのでもう暫らくお待ちください。

それとPC環境によっては見切れたりするらしいので、ノートPCのメモリ増設作業なんかが終わったら検証します.....もう仮想環境でもぶちこむか。


5\.変換元動画のCodec情報も観れる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145714/a4275684-08af-278e-8d21-2cbbdec0c3a1.png)
 

　ffmpegに渡すパラメータに適切なビットレートを指定しないとファイルサイズが結局肥大化するので、その問題を解決するためにCodec情報も読み取って表示するようにしました。
　ビットレート指定は変換元の動画以上を指定しないようにした方が、よりサイズを圧縮出来ます。最低限の品質を保てるのは500kbpsまでっぽい。
　ビットレート以外はおまけ情報です。
　ffprobe.exeを使用してます。


動画ファイルが強制終了等で中途半端な状態だとCodec情報が出力されない事があるようです。

6\.変換作業を途中で強制終了出来る
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145714/1373e708-6a89-9030-c1e6-ea79f4827aa6.png)
読みにくい黒色のButtonだけどリリース時に変えます。

~~=ffmpeg.exeを強制的にタスクキルしてます。~~  StandardInputでqキーが送れるのでそちらに変えました。念のためにアプリ終了時には強制的にタスクキルする仕様にしてます。

動画は出力されますがCodec情報が読み取れない事があります。場合によっては壊れた状態になってます。
 ffmpegOut(https://github.com/rigaya/ffmpegOut) と同じ機能ですが、結果的に軽くなりました。っていうかなんであんな重いんだろう。よく分からん。


# 　ここが凄いよという点
1\.半透明のログウィンドウが出る（カッコイイ）
　rigaya氏制作のffmpegOutの仕様をC#で模倣してます。これにより半透明のログウィンドウが実現できました。

GIFなので動いてないときは画像クリックで
3/4　ファイルサイズを半減させた（609kb）。
![bandicam 2023-02-24 18-21-54-618_Harua.mp4.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145714/8fe8cb1e-2471-003c-4c19-2bfdbe027cc5.gif)


このGIF変換は自分でもちゃんと動作してるのか不安になるぐらい変換が速いんですよ。 

（実はオープンソースだからCode見れるんだけどC言語実装で殆ど中身がどうなってるのか理解出来なかった。かろうじてrichTextBox使ってるのだけ分かった）　　
　

2\.ffmpegが終了すると女の子の声で音声が鳴る
　セリフは採用したキャラクターのものにしました。これはタスクマネージャーでプロセスキルしてもちゃんと終了イベントを受け取ります（自分でも驚きだった）。これはAviutl Extra Pack 1.14（https://www.videohelp.com/software/AviUtl） に実装されてた「やったね！」音声の模倣だったりします。GitHubに上げられているものと同じなのかどうか僕は知りません。海外の配布物って作者不詳でよく分からんのが多すぎるんですよね。





# 開発コンセプト
 2019年にマスコットアプリ文化祭なるものが開催されたらしいですが、今はもうやってないんですね。残念です。
　そこで出されたアプリにTwitterを動画変換するヤツ（https://cloth.moe/2016_twitter_convert/ ）というのがあって、どうせならTwitterにも投稿出来るようにしつつ多目的に実装してやろうと思い制作してました（ほかにも、出力されるファイルサイズがソースファイルよりデカいとか不満があった。Twitterのアップロードがクソ遅くなるんで）



　使用しているキャラクターはt／砂雲空風　@shiyokatadragon　氏から許可を得て借り受けました。ついでにアイコン（本当は動画に合成する画像の予定だった）も制作していただいたので感謝しております。　キャラクター名は安倍　春明（あべ　はるあ）と言うそうです。アプリ名はそこから取りました。



# 制限事項
　
　アプリの多重起動は制限してないですが、ffmpeg.exeの起動はアプリの起動毎に一つしか行えないようにしてます。夏場の熱暴走対策とかだったりします。
　既にffmpeg.exeが動いていても強制的に走らせるチェックボックスが付いてますが、あまり多用しない事をお勧めします。

　仕様上、同一の対象の動画ファイルに対して変換作業していても動作してしまいます（別に問題ないはずだけど何が起こるか分からんからやらないで欲しい）。場合によってはこのチェックボックス自体を非表示にする事も検討してます。
　

#  技術的な課題
・WPFだとウィンドウ角の丸め処理が出来ない。Winformのコードを入れてみたがこうかはない
　→これはそのうち誰かに聞きます。
・logWindowの標準出力に色が付けられない。
　→この点はあんまりカッコよくないので何とかしたい。




ここまで読んでいただいてありがとうございました。

# 開発の後日談
・Twitterで制作ツイートしてたら結構反響があった。
・「Twitterを動画変換するヤツ」を逆コンパイルしたらかなり単純な実装してた。

→WPF制作にあたってffmpegが正常に動かなかったり、ffmpeg.exeプロセスがアプリ終了時に残ってしまう事が頻繁にあって苦労したので(ついでに熱暴走起こしてPC自体もダウンしていた)、元ネタのアプリは完成度が高いんじゃないかと勝手に想像していた。まあそちらも苦労したのかもしれないけど.....


・そもそもffmpegにパラメータ渡す時点で苦労した
・ログウィンドウの実装も非同期処理をあまり書いたことないから難しかった
　→というか上手く動かなかったので結局await/asyncは外した。

・FFmpegのビルドとか外観（UI）の調整とか、実装以外の方面でもとんでもなく苦労した。特にFFmpegのビルドはＯＳ変えてminGWとか公式のビルド方法とかブログとかで4種類以上試した（1種類に付き6時間はかかった）。

・質問とか全くせずに全て自力で実装した。でもblogやサイトなんかで公開されてるCodeがないと厳しかったと思う。なんだかんだ言っても無料で公開されているCodeは一定の資産になる。