たくさんの自由帳
Androidのお話
たくさんの自由帳
投稿日 : | 0 日前
文字数(だいたい) : 6884
目次
本題
作った動画
風景
エンコード時間
感想
積み上げたコミット
今のプレビューだと使い物にならない
Pixel 8 Pro でエンコードに失敗し続ける
起動に失敗する
ドラッグアンドドロップがほしい
Storage Access Framework で素材を選びたい
タイムラインの機能追加
文字
編集履歴みたいなのほしい
音量スライダーの選択で段階を踏みたい
スマホの入力手段だけだとタイムライン操作が難しい
電池
クリップボード機能が欲しい
長い動画だとタイムラインが重くて挙動が怪しい
素材一覧表示が欲しいと思った
タイムラインの下の方を見るためにスクロールすると時間も消える
Compose+Material3+BottomSheetでテキスト選択時のメニューが出ない
プロジェクトを持ち出す機能が欲しい
おわりに
どうもこんばんわ。
satellite
なiPhone
です。ちなヨドバシ。
ところでカメラコントロールって無印 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
とかもこんな感じだと思う。
ただ、このアプリにはゆっくり音声を生成する機能がないので、上にゆっくり音声を生成できるアプリをポップアップで表示させている。
この手のポップアップで上に重ねて表示する機能、Xperia
以外にもあったりするけどいまいち使い道が分からんかった。けどここで使うのかって気持ちになった。
Xperia
のスモールアプリ、いつの間にかなくなってしまったけど好きなアプリをオーバーレイできるようになって再登場。
へへへ、アップロードします。
いつもはパソコンで作るのでなんか新鮮
1080p
、60fps
で、27分
くらいの動画ですが、エンコードにかかった時間は6、7時間くらいでした。(!!!?)
うーん?時間かかり過ぎでは?。
ちなみに、スマホのスペックは去年(2023年)のハイエンドXperia 1 V
で、Snapdragon 8 Gen 2
で十二分な性能なはず。
やっぱり動画フレームを取り出してCanvas
に書いてるのが相当遅い。
動画フレームを直接OpenGL ES
のテクスチャとして使う機能があるので、もうそれを使うべきな気がする。後で話します。
動画編集中にいろいろ改善点が見つかって、それらの機能を作るためコミットを積みました。
もうパソコンで動画作れ
Compose
のStrong Skipping Mode
を有効に
まだリリースできてない機能があってあれ、出します。
今のところプレビューはまじで使い物にならない。
ちなみに、動画素材さえなければそんなに遅くないはず。文字と画像だけみたいな。あと音声か。
動画素材からフレームを取り出すのが遅すぎる。
作ってた当時は、OpenGL ES
は難しいから、極力避けてCanvas
でなんとかしようとしてた。
いや、詳しく言うとCanvas
で書いてBitmap
にしてOpenGL ES
で描画し、エンコードしてた。Android の エンコーダー(MediaCodec)
はCanvas
やBitmap
を受け入れず、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
に書くのがするのが遅いんで結局書き直したほうが良さそ)
Android
のCamera2 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
HDR
、Pixel 8 Pro
のクソ明るい画面で見ると結構感動するしで、いつかやってみたい。
ちなみにこの通知は実装してないです。
失敗し続けてて調査のため付け焼き刃的な感じでエラー通知を出すようにしただけで、機能としては存在してないです、、
ベンチマークのために、Pixel 8 Pro
でも同じ動画のエンコードをやってみたんだけど、エンコーダーにフレームを渡すOpenGL ES
の部分でときたま落ちてしまい、数回試してみたけどだめだった。しかも失敗してる箇所が毎回違って謎。
Snapdragon
搭載のXperia
だと普通に成功したので、よく分からん、、、こっちでも落ちるんだったら私のコードが悪いんだけどさ。
原因はわからないですが、考えられるのが、
Android
がBeta
版だから?の可能性Google Pixel
シリーズはExynos
系のSoC
で、その中にあるMali GPU
のOpenGL ES
実装がイマイチな可能性Snapdragon
のAdreno GPU
が大目に見ているだけ。たまたま動いている可能性ん~~~
動画編集が中盤くらいに差し掛かった頃。
アプリが起動しません。しばらくすると落ちます。
というわけで見てみたところ、音声素材を合成するための作業で必要な、音声のハードウェアデコーダーが起動上限か何かに引っかかってエラーになってた。
音声は最初にデコードして、同じ時間に鳴らすべき音を合成(足し算)してるんだけど、このデコード処理が起動するたびに走ってた。
というわけで、音声素材はデコードしたら、消さずにそのまま使い回すようにしました。ファイルのハッシュを名前にするとかやったはずです。
(そして書いてて気付いた、これ消す方法ないわ)
一部の写真アプリや、ファイルマネージャーはドラッグアンドドロップに対応してて、このままメーラーやメッセージアプリへドロップするとそのまま添付できる。
やっぱり狙った写真を探すのは、フォトピッカー
よりもアプリのほうが速いんだよな。スクロールだって簡単だし。
私のアプリにもこれほしい!!ってなったんだけど、Android
のファイルの仕様のせいで厳しそう。。。
というのも、写真や動画や音声の素材はフォトピッカー
やStorage Access Framework
で選ばせているわけですが、選んだファイルへアクセスできるのってアプリが生きている間(プロセスが生きている間)なんですよね。
例えばアプリを再起動したらそのファイルへはアクセスできなくなる。Amazon S3
の署名付きURLが近いのかも。
それじゃ使い勝手が最悪なので、Android
は永続化出来る手段を用意してくれている。この永続化にも文章化されてない罠があるんですが、それは別の時に。
で、この永続化を使うためにはフォトピッカー
や、Storage Access Framework
でファイルを選ぶ必要がある。
それ以外の方法、例えば今回のような、ドラッグアンドドロップで受け取ったファイルは永続化する事ができない気がする。多分出来なさそう。
そのため、ファイルをまるまる自分のストレージにコピーする必要があるんだけど、それだと容量を無駄に消費してしまうので、なんとかならないものなのか、、、
これは特に懸念点もないはずで対応したい。
フォトピッカー
、見た目は良いんだけど選びにくい。プレビューが使いにくかったり、パスを知ってる場合にはこっちのが便利。
サムネだけじゃ分からんからファイル名も見たいときが多々ある。
タイムライン操作はかなり向上させた、磁石モード(他の素材の隣に置く、他の素材と時間を合わせる)とか、素材の複製とか。
動画編集中に思ってコミットを積みました。。。やっぱパソコンで作れよ。
複数行テキストの中央揃え欲しい。つけるか。
Canvas
のdrawText
(だっけ?)、複数行は一行ごとdrawText()
しないといけないはずで、それがめんどくてやってなかった可能性。
履歴の一覧出したい。何を編集したか。
タイムラインはデータクラスになってて、編集するたびにデータクラスがコピーされるので、直近のタイムライン操作履歴みたいなのは作れそう?どこを編集したかはわからんか。
段階を踏めるようにするべきだった。やります。
微調整すぎる。狙った位置にするのがむずい。
パソコンで使われているタイムラインのUI
を、何も考えずにスマホへ持ってきたけど、あれはマウスとキーボードがある前提だったわ。タッチ操作だと入力手段が足りない。
範囲選択して素材をまとめて移動する方法が欲しいかもって思ったんだけど、そもそもスマホだとどうすれば良いん?
あとタイムラインのロック機能が欲しいと思った。素材が動かないように。
スクロールするはずが素材動かしてしまった!って事故が減るはず。というか、スクロールのためにタイムラインを開けておく必要がある。
スマホ向けにタイムラインをスクロールするための何かが別に必要だと思った。何かって何?
とにかく入力手段が足りなくて困ってる。っぱこれパソコンで動画作ればよくね。
あとJetpack Compose
には斜めにスクロールするためのModifier
を作って欲しいです。
前回の充電から26%
消費しました。って普通なの?
複製とは別に、コピーしてタイムラインの好きな位置に貼り付け出来る機能がほしい。作ろうかな。
見えない部分まで描画してるので、今回のように27分
とかの動画だと重たくなって、挙動が怪しい。
複製してもワンテンポ遅れて反映されたりとか。。画面内だけ描画ってなんか綺麗にできるかなあ。。。
BGM
どれ使ってたっけ?ってなることがあって確認するすべが欲しいと思った。
あばよくば音声素材だけフィルターみたいな。
Sticky Header
みたいなのがあれば、、、、、、
BOM
の2024.09.00
で修正されてました!!!!
まだリリースできてませんが、つけました。zip
でプロジェクトに必要なファイルが詰め込まれるように。
実質バックアップみたいな使い方ですが。。。
フォアグラウンドサービスでエンコードをやらせているため、アプリを離れてもエンコードが続くのが唯一良いところなのかも知れません。
https://www.macstories.net/stories/not-an-ipad-pro-review/#lack-of-background-processes-and-system-wide-utilities