たくさんの自由帳

自作動画編集アプリで実際に動画編集してみた感想

投稿日 : | 0 日前

文字数(だいたい) : 6884

どうもこんばんわ。
satelliteiPhoneです。ちなヨドバシ。

Imgur

ところでカメラコントロールって無印 iPhoneにもあったんですね。
Dynamic IslandといいLightning 廃止といいまずはProから投入されてたので、今回も無印は後回しだと思ってた。

Apple Intelligence は来年まで来ません・・・

本題

前作った自作の動画編集アプリ(大した機能はない)で動画を作ってみたので感想。
ドッグフーディング

作った動画

https://www.nicovideo.jp/watch/sm44212192

1080p(1920x1080)の、60fpsなので、なかなか豪華。

動画の内容は前記事にした、マイクラ1.20.6自作のMODの対応して、テストプレイをするという内容。
https://takusan.negitoro.dev/posts/minecraft_mod_1_20_6_migration/

記事の中にはありませんが、このあとのテストプレイを録画していたので、、、

風景

これがタイムライン、
大体パソコンのYMM3とかもこんな感じだと思う。

Imgur

Imgur

Imgur

ただ、このアプリにはゆっくり音声を生成する機能がないので、上にゆっくり音声を生成できるアプリをポップアップで表示させている。
この手のポップアップで上に重ねて表示する機能、Xperia以外にもあったりするけどいまいち使い道が分からんかった。けどここで使うのかって気持ちになった。

Xperiaのスモールアプリ、いつの間にかなくなってしまったけど好きなアプリをオーバーレイできるようになって再登場。

へへへ、アップロードします。
いつもはパソコンで作るのでなんか新鮮

Imgur

Imgur

エンコード時間

1080p60fpsで、27分くらいの動画ですが、エンコードにかかった時間は6、7時間くらいでした。(!!!?)
うーん?時間かかり過ぎでは?

ちなみに、スマホのスペックは去年(2023年)のハイエンドXperia 1 Vで、Snapdragon 8 Gen 2で十二分な性能なはず。

やっぱり動画フレームを取り出してCanvasに書いてるのが相当遅い。
動画フレームを直接OpenGL ESのテクスチャとして使う機能があるので、もうそれを使うべきな気がする。後で話します。

感想

積み上げたコミット

動画編集中にいろいろ改善点が見つかって、それらの機能を作るためコミットを積みました。
もうパソコンで動画作れ

  • タイムラインがおもすぎてComposeStrong Skipping Modeを有効に
    • 見えない部分まで描画しているという、実装が悪いのであんまり改善されませんでしたが
  • 編集中プロジェクトを持ち出せる機能
  • 音声素材のデコード結果を持ち回すように
  • デコーダーの同時利用上限に引っかからないよう制限を
  • などなど

まだリリースできてない機能があってあれ、出します。

今のプレビューだと使い物にならない

今のところプレビューはまじで使い物にならない。
ちなみに、動画素材さえなければそんなに遅くないはず。文字と画像だけみたいな。あと音声か。

動画素材からフレームを取り出すのが遅すぎる。
作ってた当時は、OpenGL ESは難しいから、極力避けてCanvasでなんとかしようとしてた。
いや、詳しく言うとCanvasで書いてBitmapにしてOpenGL ESで描画し、エンコードしてた。Android の エンコーダー(MediaCodec)CanvasBitmapを受け入れず、OpenGL ESで描画してエンコーダーに渡すのが正攻法っぽい。つまりOpenGL ESは使ってはいたんだけど、難しいから最小限にしてた。複雑すぎる。

そのため、動画素材も、フレームを一枚一枚取り出して、Canvasに書いていた。
先述の通り複雑にしたくなかったのと、連続してフレームを取り出す処理を自前で書いたので(MediaMetadataRetrieverより速くなるように)、そんなに影響がないはずだと思ってたんですよ!。
OpenGL ESで複雑になるくらいなら速度を犠牲にした。

が。いくら何でも遅すぎる。プレビュー出来ないのは痛い。OpenGL ESで作り直そうかなって。まだ草案しか考えてないけど。
かわりにSurfaceTextureっていう、OpenGL ESで動画やカメラの映像をそのままテクスチャとして使うクラスがあるので、これに乗っかるようにしたい。(何回かこのブログでも登場してます)

複雑になるんだけど、
前と後ろのカメラを同時に利用し、OpenGL ES で映像を重ねて表示するアプリ
とか、
単一画面の画面共有に対応したミラーリングアプリ
とかで、OpenGL ESを使っているので、(まあ簡単なシェーダーとコピペなんですが)
ちょっとだけ知見が溜まってきた。これなら複雑な部分を隠蔽しつつ、動画素材だとしてもフレームをテクスチャとして使えるためOpenGL ESの高速な描画の恩恵が受けれられるはず。

あと、書き直したい理由がもう一個あって、10ビット HDR動画の編集がOpenGL ESだと実現できそう?。
今のプレビューや動画のエンコードはCanvasで書いてBitmapにしてるんですが、Canvas / Bitmapって10ビットというかRGBA_1010102みたいなのって出来るの?
(まあ仮に出来たところで、動画フレームをBitmapで取り出してCanvasに書くのがするのが遅いんで結局書き直したほうが良さそ)

AndroidCamera2 APIのサンプルがOpenGL ES 3で書かれてて、ちょうどHDRのカメラ映像のテクスチャを描画しているのがこの辺。
https://github.com/android/camera-samples/blob/a07d5f1667b1c022dac2538d1f553df20016d89c/Camera2Video/app/src/main/java/com/example/android/camera2/video/HardwarePipeline.kt#L107

HDRPixel 8 Proのクソ明るい画面で見ると結構感動するしで、いつかやってみたい。

Pixel 8 Pro でエンコードに失敗し続ける

ちなみにこの通知は実装してないです。
失敗し続けてて調査のため付け焼き刃的な感じでエラー通知を出すようにしただけで、機能としては存在してないです、、

Imgur

Imgur

ベンチマークのために、Pixel 8 Proでも同じ動画のエンコードをやってみたんだけど、エンコーダーにフレームを渡すOpenGL ESの部分でときたま落ちてしまい、数回試してみたけどだめだった。しかも失敗してる箇所が毎回違って謎。
Snapdragon搭載のXperiaだと普通に成功したので、よく分からん、、、こっちでも落ちるんだったら私のコードが悪いんだけどさ。

原因はわからないですが、考えられるのが、

  • AndroidBeta版だから?の可能性
  • Google PixelシリーズはExynos系のSoCで、その中にあるMali GPUOpenGL ES実装がイマイチな可能性
  • SnapdragonAdreno GPUが大目に見ているだけ。たまたま動いている可能性

ん~~~

起動に失敗する

動画編集が中盤くらいに差し掛かった頃。
アプリが起動しません。しばらくすると落ちます。

というわけで見てみたところ、音声素材を合成するための作業で必要な、音声のハードウェアデコーダーが起動上限か何かに引っかかってエラーになってた。
音声は最初にデコードして、同じ時間に鳴らすべき音を合成(足し算)してるんだけど、このデコード処理が起動するたびに走ってた

というわけで、音声素材はデコードしたら、消さずにそのまま使い回すようにしました。ファイルのハッシュを名前にするとかやったはずです。
(そして書いてて気付いた、これ消す方法ないわ)

ドラッグアンドドロップがほしい

一部の写真アプリや、ファイルマネージャーはドラッグアンドドロップに対応してて、このままメーラーやメッセージアプリへドロップするとそのまま添付できる。
やっぱり狙った写真を探すのは、フォトピッカーよりもアプリのほうが速いんだよな。スクロールだって簡単だし。

私のアプリにもこれほしい!!ってなったんだけど、Androidのファイルの仕様のせいで厳しそう。。。

というのも、写真や動画や音声の素材はフォトピッカーStorage Access Frameworkで選ばせているわけですが、選んだファイルへアクセスできるのってアプリが生きている間(プロセスが生きている間)なんですよね。
例えばアプリを再起動したらそのファイルへはアクセスできなくなる。Amazon S3の署名付きURLが近いのかも。

それじゃ使い勝手が最悪なので、Androidは永続化出来る手段を用意してくれている。この永続化にも文章化されてない罠があるんですが、それは別の時に。
で、この永続化を使うためにはフォトピッカーや、Storage Access Frameworkでファイルを選ぶ必要がある。

それ以外の方法、例えば今回のような、ドラッグアンドドロップで受け取ったファイルは永続化する事ができない気がする。多分出来なさそう。
そのため、ファイルをまるまる自分のストレージにコピーする必要があるんだけど、それだと容量を無駄に消費してしまうので、なんとかならないものなのか、、、

Storage Access Framework で素材を選びたい

これは特に懸念点もないはずで対応したい。
フォトピッカー、見た目は良いんだけど選びにくい。プレビューが使いにくかったり、パスを知ってる場合にはこっちのが便利。
サムネだけじゃ分からんからファイル名も見たいときが多々ある。

タイムラインの機能追加

タイムライン操作はかなり向上させた、磁石モード(他の素材の隣に置く、他の素材と時間を合わせる)とか、素材の複製とか。
動画編集中に思ってコミットを積みました。。。やっぱパソコンで作れよ。

文字

複数行テキストの中央揃え欲しい。つけるか。
CanvasdrawText(だっけ?)、複数行は一行ごとdrawText()しないといけないはずで、それがめんどくてやってなかった可能性。

編集履歴みたいなのほしい

履歴の一覧出したい。何を編集したか。
タイムラインはデータクラスになってて、編集するたびにデータクラスがコピーされるので、直近のタイムライン操作履歴みたいなのは作れそう?どこを編集したかはわからんか。

音量スライダーの選択で段階を踏みたい

Imgur

段階を踏めるようにするべきだった。やります。
微調整すぎる。狙った位置にするのがむずい。

スマホの入力手段だけだとタイムライン操作が難しい

パソコンで使われているタイムラインのUIを、何も考えずにスマホへ持ってきたけど、あれはマウスとキーボードがある前提だったわ。タッチ操作だと入力手段が足りない。
範囲選択して素材をまとめて移動する方法が欲しいかもって思ったんだけど、そもそもスマホだとどうすれば良いん?

あとタイムラインのロック機能が欲しいと思った。素材が動かないように。
スクロールするはずが素材動かしてしまった!って事故が減るはず。というか、スクロールのためにタイムラインを開けておく必要がある。

スマホ向けにタイムラインをスクロールするための何かが別に必要だと思った。何かって何?
とにかく入力手段が足りなくて困ってる。っぱこれパソコンで動画作ればよくね。

あとJetpack Composeには斜めにスクロールするためのModifierを作って欲しいです。

電池

前回の充電から26%消費しました。って普通なの?

Imgur

クリップボード機能が欲しい

複製とは別に、コピーしてタイムラインの好きな位置に貼り付け出来る機能がほしい。作ろうかな。

長い動画だとタイムラインが重くて挙動が怪しい

見えない部分まで描画してるので、今回のように27分とかの動画だと重たくなって、挙動が怪しい。
複製してもワンテンポ遅れて反映されたりとか。。画面内だけ描画ってなんか綺麗にできるかなあ。。。

素材一覧表示が欲しいと思った

BGMどれ使ってたっけ?ってなることがあって確認するすべが欲しいと思った。
あばよくば音声素材だけフィルターみたいな。

タイムラインの下の方を見るためにスクロールすると時間も消える

Sticky Headerみたいなのがあれば、、、、、、

Compose+Material3+BottomSheetでテキスト選択時のメニューが出ない

BOM2024.09.00で修正されてました!!!!

プロジェクトを持ち出す機能が欲しい

まだリリースできてませんが、つけました。zipでプロジェクトに必要なファイルが詰め込まれるように。
実質バックアップみたいな使い方ですが。。。

おわりに

フォアグラウンドサービスでエンコードをやらせているため、アプリを離れてもエンコードが続くのが唯一良いところなのかも知れません。
https://www.macstories.net/stories/not-an-ipad-pro-review/#lack-of-background-processes-and-system-wide-utilities