たくさんの自由帳
Androidのお話
たくさんの自由帳
投稿日 : | 0 日前
文字数(だいたい) : 3672
どうもこんばんわ、(お久しぶりです)
D.C.4 Sweet Harmony ~ダ・カーポ4~ スイートハーモニー 攻略しました。
めっちゃいいですね、ヒロインみんなかわいい!
ここの話ほんとかわいい
ここほんとすき
あぁぁぁ
本編では焦点があまり当てられなかったヒロインたちのストーリーが本作でちゃんとしてていい!
実用性もあるとおもう
ぜろみらーを作りました。ミラーリングアプリです。
とりあえずリリースしましたが、多分動く端末のほうが少ないと思う←!?
ニコ生のコミュの名前にありそうですが関係ないです。
VP9
でエンコードする機能もあります。H.264
と比べて同じビットレートだと多分きれいな気がする...ブラウザがあれば使える → ほぼ設定がない → Zero ( Config ) Mirroring → ぜろみらー
結構無理やりなので負荷がやばいかも
あと動画を細切れにしている以上、切り替えで一瞬ロードされちゃいます...
端末の画面録画と(あれば)端末内音声を集めて、動画を細切れにして、ブラウザへWebSocketで送信してます。
もっといい方法があったかもしれない...
Androidの画面録画、端末内音声の内容をMediaProjection
で受け取ります。
(画面録画はSurface
、端末内音声はPCM
)
受け取ったらMediaCodec
でH.264
か(設定したら)VP9
にエンコードします。
エンコードしたらMediaMuxer
を使いmp4
かwebm
の動画ファイルにします、一定期間経ったらファイルを切り替えてまた保存します。
できた動画ファイルをWebSocket
を使ってブラウザへ通知して(動画ファイルのパス)、ブラウザの<video> タグ
で再生します。
動画ファイルを細切れで作って、ブラウザで再生しているだけです。はい
リアルタイム配信といえばこれ?
HLS
はMediaMuxer
がMPEG2-TS
のコンテナフォーマットに対応していないので無理です!(これは後述)
MPEG-DASH
もMediaMuxer
がFragmented MP4
を作れないので多分無理です。
ブラウザで見たかったので(追加のアプリが必要とかは敷居が高い!)今回は動画ファイルを細切れにして送ることにした。
iOS
だと出来るみたいなのですが残念ですね...
(ffmpeg? バイナリが大きくなる上にライセンスがね...)
MediaMuxer#addTrack
がスタート前じゃないと呼べないため、使いにくい!
それとは別なのですが、高レベルAPIのMediaRecorder
にはMPEG2-TS
のコンテナフォーマットに対応しているのですよね。
一方今回使った低レベルAPIのMediaMuxer
にはMPEG2-TS
のサポートはありません!え逆では
ならMediaMuxer / MediaCodec
とかを使わずに、MediaRecorder
を使えばHLS
で配信出来たの!?って話になるんですが、
ならないです。内部音声を収録して一緒の動画ファイルにしたかったので。残念。
それに加えて、もし内部音声がなかった場合でも動画を短い間隔で作り直すのはMediaRecorder
では多分難しいような気がします。遅延が大きくなりそう。
MediaMuxer
のインスタンスを作り直した場合は、MediaCodec.BufferInfo
のpresentationTimeUs
を0
からスタートするようにする必要があるみたいです。
https://github.com/takusan23/ZeroMirror/commit/3718678180bea6037c0e23d2686b2265b2d4e58f
あとVP9
の場合は解像度が厳しいです(1920x1080、1280x720 なら動く)、ディスプレイの画面解像度をそのまま入れたら落ちてしまう。
mp4ファイルをストリーミングできるように(ダウンロードしながら再生)するには、mp4
ファイルの先頭にmoovブロック
を置く必要があるらしい(?)のですが、
MediaMuxer
の場合は最後にmoovブロック
を置くため、ストリーミング出来ません(全部ダウンロードしてから再生してしまう)
ffmpeg
が入ってる場合は以下のコマンドを叩くことで、moovブロック
の位置が分かります。
ffmpeg -v trace -i ファイル.mp4 2>&1 | grep -e type:\'mdat\' -e type:\'moov\'
多分こうなっていれば正解なのですが
MediaMuxer
で出来たファイルはmoovブロック
が一番下なのですよね...
この問題はすでに先駆け者さんが対応してくれています!
すごい!
上記のプログラムをお借りすることで、moovブロック
を先頭に移動できました、ありがとうございます!
ちなみにブラウザでもストリーミング再生なのでバッファリングの表示がされるようになります。
なおWebM
の場合は特に何もせずともストリーミング可能なファイルにしてくれるみたい
新しめの端末じゃないと動かないっぽい?
動かない理由もよくわからん(MediaCodec
のクラッシュログが不親切)
これはまじで謎です。
なんかエンコーダーの設定間違えたのかな。
追記:すいませんサンプリングレート間違ってただけでした。
わかりません、Chromeだと再生されませんでした。
Pixel 6 Pro のディスプレイちょっとだけ画面傷入っちゃって悲しい。
D.C.5 !?