2024.12.19
システムの穴を運用でカバーしようとしてミス多発… バグが大量発生、決算が合わない状態から業務効率化を実現するまで
リンクをコピー
記事をブックマーク
川上健太郎氏:次は動画の描画です。先ほどもちらっと言ったんですが、Platform Viewではなくて、Texture Widgetを使っています。詳しい説明はこのURLを見てもらいたいんですが、プラットフォーム側からtextureIdを受け取って、ビデオフレーム到着時に自動的にバックエンドの指示に従って再描画されます。通常Dartのコード実行は含まれません。
要するにtextureIdを受け取って、それを渡すとよしなにやってくれます。実際どんな感じなのかをDart、iOS、Androidで見ていきたいと思います。
まずDartです。Dartはメチャクチャ簡単です。VideoPlayerControllerにbuild関数があるんですが、それはVideoPlayerPlatformのbuildViewを参照しています。buildViewは受け取ったtextureIdをTextureに渡しているだけです。
次はiOSです。iOSはプレーヤーを実装するクラスをFlutterTextureに準拠します。FlutterTextureの中に含まれているcopyPixelBufferはどういうものかというと、AVPlayer videoOutputがあって、そこから最新のPixelBufferを取ってきて返すという処理が書かれています。
onTextureUnregisteredというのは、FlutterTextureがUnregisteredされたときの処理を書きます。ここではdispose関数を呼んでいますね。
FlutterTextureを管理するFlutterTextureRegistryというものがあります。上のregistertextureは、registory.registerTexture:player、FlutterTextureに準拠したものを渡すと、textureIdが返ってくるので、これをDart側に渡して、それをもとにTexture Widgetを描画する仕組みになっています。
textureFrameAvailableという関数は、FlutterにTextureが更新されたことを伝えます。これを呼ぶと、FlutterTexture.copyPixelBufferが呼び出されます。iOSではCADisplayLinkが作成されていて、その中のセレクターの中でこの関数が呼ばれています。これはTextureをUnregisterするときの処理です。
次は、Androidです。AndroidもTextureRegistryがあって、これはiOSよりもさらに簡単です。このcreateSurfaceTextureでtextureIdを返すSurfaceTextureEntryが生成され、このidを使用します。先ほどのTextureのRegisterとSurfaceTextureをFlutterEngineがよしなに管理してくれます。
作成したSurfaceTextureをExoPlayerにセットするとよしなにやってくれて、textureIdもゲットできます。
次に、機能の追加について説明したいと思います。機能を追加するには、PigeonというFlutterが出しているパッケージが使われています。プラットフォームとDartの接続部分を自動生成してくれる便利なものです。
pigeon/messages.dartという自動生成の元ファイルのDartファイルに、設定したいmessageと渡したいものを置きます。LimitBitrateMessageはサンプルで画質設定のものです。
video_playerAPIのabstractクラスの中に、setLimitBitrateMessageを渡して、コマンドを実行して、Flutterプラグインの独自のフォーマットを実行すると、各プラットフォームファイルを生成してくれます。
本当はこのあたりもメチャクチャ書きたかったんですが、時間がなくて端折りました。実装についてのまとめです。iOSはObjective-C、AndroidはJavaでそれぞれ実装しなければいけません。
最後にまとめです。ガチガチの要件じゃなければ、けっこうサクッと導入できそうだなと思いました。私は元iOSエンジニアで、Objective-Cを見たことはあるけど、実は書いたことはないゆとり教育な者なんですが、Objective-Cを初めて触って書いてみて、今はiOSはSwift、AndroidはKotlinという時代なのに逆戻りじゃないですが、なんか不思議な気持ちになりました。Javaは書きやすかったです。
あとiOSエンジニアとして、ExoPlayerのexampleがメチャクチャ充実していて感動しました。iOSのプレーヤーってけっこう手探りなことが多いんですが、ExoPlayerのexampleは有志の結晶というか、ものがわかりやすく、設計も見やすかったので、iOSにもあのようなものが欲しいと思いました。
以上です。ありがとうございました。
2024.12.20
日本の約10倍がん患者が殺到し、病院はキャパオーバー ジャパンハートが描く医療の未来と、カンボジアに新病院を作る理由
2024.12.19
12万通りの「資格の組み合わせ」の中で厳選された60の項目 532の資格を持つ林雄次氏の新刊『資格のかけ算』の見所
2024.12.16
32歳で成績最下位から1年でトップ営業になれた理由 売るテクニックよりも大事な「あり方」
2023.03.21
民間宇宙開発で高まる「飛行機とロケットの衝突」の危機...どうやって回避する?
PR | 2024.12.20
モンスター化したExcelが、ある日突然崩壊 昭和のガス工事会社を生まれ変わらせた、起死回生のノーコード活用術
2024.12.12
会議で発言しやすくなる「心理的安全性」を高めるには ファシリテーションがうまい人の3つの条件
2024.12.18
「社長以外みんな儲かる給与設計」にした理由 経営者たちが語る、優秀な人材集め・会社を発展させるためのヒント
2024.12.17
面接で「後輩を指導できなさそう」と思われる人の伝え方 歳を重ねるほど重視される経験の「ノウハウ化」
2024.12.13
ファシリテーターは「しゃべらないほうがいい」理由 入山章栄氏が語る、心理的安全性の高い場を作るポイント
2024.12.10
メールのラリー回数でわかる「評価されない人」の特徴 職場での評価を下げる行動5選
Climbers Startup JAPAN EXPO 2024 - 秋 -
2024.11.20 - 2024.11.21
『主体的なキャリア形成』を考える~資格のかけ算について〜
2024.12.07 - 2024.12.07
Startup CTO of the year 2024
2024.11.19 - 2024.11.19
社員の力を引き出す経営戦略〜ひとり一人が自ら成長する組織づくり〜
2024.11.20 - 2024.11.20
「確率思考」で未来を見通す 事業を成功に導く意思決定 ~エビデンス・ベースド・マーケティング思考の調査分析で事業に有効な予測手法とは~
2024.11.05 - 2024.11.05