AndroidアプリケーションにINDEを実装した方法



既製のライブラリをアプリケーションで使用すると、プログラマーが自転車を発明するという非生産的な労力から解放され、アプリケーションが市場に参入するまでの時間が短縮され、その機能に有益な効果があります。 これらすべてのポイントを独自の例で説明できます。 この記事では、既存のTogetherビデオカメラアプリケーションでAndroidのビデオを操作するためのIntel INDE( Integrated Native Developer Experience )ライブラリの実装プロセスについて説明し、アプリケーションの特定のニーズに応じた機能の実装例を提供し、INDEの前後の開発の難しさについて説明します。





背景

一緒に2012年にアプリケーションを開始しました。 ほとんどの場合、私たちはクライアントのプロジェクトに取り組み、さまざまなビデオサービスとアプリケーションを開発していたため、このプロジェクトは何らかの形で企業の趣味でした。 Togetherは、ビデオライブラリ(すべてのビデオに簡単にアクセスできる)を整理できるシンプルで便利なビデオエディタとして考案されました。 編集機能は可能な限りシンプルにする必要があります。これにより、ビデオエディタの概念に不慣れなユーザーが、最短時間で短編映画を快適に作成できるようになります。



INDEの導入前の開発

当時は、Android向けのビデオを操作するものはほとんどありませんでした。わずかにインテリジェントなビデオ処理を行うには、Cコードに没頭する必要がありました。 すべてのビデオ処理は、オープンソースソフトウェアffmpegに基づいて行いました。 このアプローチでは、多大な時間と開発努力が必要でした。 ローンチ後、数十台のデバイスからなるテストデバイスのラボは非常に少なく、さまざまなプラットフォームで文書化された何百ものエラーがユーザーから寄せられていることがわかりました。 独自のクライアントビデオSDKの開発には、ユーザーエクスペリエンスの向上から、メイン製品の時間がかかりました。 何かをする必要がありました。



INDEの紹介

INDEツールキットに関するニュースは本当に興味を持ちました。 Droidcon 2014カンファレンスで彼について誤って聞いたのですが、まず、次のプラットフォーム機能が重要でした。



これらの少数のポイントでさえ、私たち自身の開発の結果をカバーしています。 この瞬間から、アプリケーションの機能を設計するアプローチは根本的に変わりました。 今、私たちはユーザー与えることができるものではなく、ユーザーが望むものに基づいています

INDEライブラリを使用するために既存の機能を移行するのに数日かかりました。 たとえば、ビデオをトリミングするには、MediaComposerの作成時にセグメントを追加するだけです。



private void setTranscodeParameters(MediaComposer composer) throws IOException { composer.addSourceFile(inputFile); composer.setTargetFile(outputFile); configureVideoEncoder(composer, videoWidthOut, videoHeightOut); configureAudioEncoder(composer); MediaFile mediaFile = mediaComposer.getSourceFiles().get(0); mediaFile.addSegment(new Pair<Long, Long>((long)startCutTime, (long)endCutTime)); configureRotateEffect(composer); }
      
      





サーバーに送信する前にビデオを縮小するには、トランスコーディングを開始する前にMediaComposeraパラメーターで必要なサイズを設定するだけです。 さらに、サイズが元のビデオに比例していない場合でも、指定された長方形に問題なく収まります。



 private void configureVideoEncoder(MediaComposer composer, int outWidth, int outHeight) { VideoFormatAndroid videoFormat = new VideoFormatAndroid(videoMimeType, outWidth, outHeight); videoFormat.setVideoBitRateInKBytes(videoBitRateInKBytes); videoFormat.setVideoFrameRate(videoFrameRate); videoFormat.setVideoIFrameInterval(videoIFrameInterval); mediaComposer.setTargetVideoFormat(videoFormat); }
      
      







私たちの理解が難しい、INDEの用語でソースのメタ日付を考慮に入れたビデオ反転の操作は、ビデオ効果としてのみリストされていました。



 private void configureRotateEffect(MediaComposer composer) { if (rotation == 0) return; IVideoEffect effect = new RotateEffect(rotation, factory.getEglUtil()); //       effect.setSegment(new Pair<Long, Long>(0L, 0L)); composer.addVideoEffect(effect); }
      
      







つまり、必要に応じて、トランスコーディングの過程で、特定の期間にエフェクトが重畳されるため、ビデオの一部のみを裏返すことができます。 これがどこで役立つか想像するのは難しいですが、何らかの理由で機会自体は喜ばれます。



これらの数行のコードで、ビデオを操作するための以前の機能をすべてINDEライブラリに転送しました。 そして、以前は夢にも思わなかったもの、つまり、ユーザーのデバイスでアルバムの全体的なビデオファイルを作成することなど、私たちは夢中になりました。



危機にunderstandしているものを理解するために、Togetherのアルバムはカスタムビデオと写真のコレクションであり、その順序は編集画面で簡単にカスタマイズできます。 そこで、適切なサウンドトラックを選択して、ビデオシリーズ全体の上に重ねることができます。 特に重要なビデオの瞬間については、メインのサウンドトラックをバックグラウンドにして元のサウンドを保存する機会を残しました。 例はここにあります



アルバムの主な目的は、ビデオストーリーの作成とソーシャルネットワークでの迅速な共有です。 この目的のために、開発の初期段階であってもネットワークにビデオをアップロードする必要があるため、クラウドでアルバムをトランスコードすることが決定されました。 したがって、トランスコーディングプロセスの均一性が達成され、ユーザーデバイスのリソースが節約されます。 しかし、その後、いくつかの問題を発見しました。



したがって、ビデオの順序が変更されるたびにデバイスでアルバムを追加トランスコードすると、すべての問題が解決され、ユーザーは完全に正確でない場合は最終フィルムの非常に近いバージョンを見ることができます。 この機能は、アルバムのコンパイルと編集が完全にオフラインで行われ、サイトにアクセスして結果を見ることが不可能な場合に特に便利です。 ffmpegで同様の問題を解決し、最も重要なことには、すべてのデバイスで同等に機能する結果を達成することは、非常に時間がかかります。 INDEを使用すると、たった1週間しかかかりませんでした。



アルバムのトランスコード

MediaComposerの初期化プロセスは非常に柔軟でシンプルであるという事実にもかかわらず、この場合、いくつかの予備的な手順が必要でした。 特に、アルバムを接着する前に、すべての画像をビデオに変換する必要があります。 これを行うために、INDE開発者のアドバイスに従って、30秒の「空の」ビデオファイル(80 kb)をアプリケーションに追加し、JpegSubstitudeEffectを適用して、希望の期間にトリミングしました。 写真を数秒間静的に表示するだけでなく、JpegSubstitudeEffectを継承し、各フレームの写真座標を変換して、カスタムアニメーションを取得することができます。



不快な驚きは、写真を並行ストリームのビデオに同時に変換するためのいくつかのコマンドを実行することが不可能だったという事実でした。 MediaComposer-aの同時インスタンス数には制限があり、デバイスごとに異なります。 たとえば、Samsungデバイスでは、3つ以上のインスタンスを起動できませんでした。 この点で、画像を連続して変換する必要がありましたが、これは非常に時間がかかります。



接着する前にいくつかのビデオをトリミングする必要がある場合と同様に、ビデオ/オーディオ効果についてもまったく同じ準備作業を行う必要があります。 したがって、これらはすべて、事前にアーキテクチャ的に検討する必要があります。 準備作業が完了したら、接着自体は非常に簡単です。



 @Override protected void setTranscodeParameters() throws IOException { String firstPath = playlist.get(0).localPath; Uri firstMediaUri = new Uri(firstPath); mediaComposer.addSourceFile(firstMediaUri); mediaComposer.setTargetFile(dstMediaPath); configureVideoEncoder(mediaComposer, videoWidthOut, videoHeightOut); configureAudioEncoder(mediaComposer); // add source files in cycle Uri nextUri = null; for (int i = 1; i < playlist.size(); i++) { nextUri = new Uri(playlist.get(i).localPath); mediaComposer.addSourceFile(nextUri); } }
      
      







失敗したもの

デバイス上のクラウドでアルバムをトランスコードした結果を完全に繰り返すには、接着されたビデオの上にサウンドトラックを追加することもできるはずです。 ライブラリの現在のバージョンでは、SubstituteAudioEffectのいくつかの問題により、これはまだ可能ではありません。現在、開発者と活発に議論されています。 したがって、現時点では、アプリケーションのサウンドトラックは、ビデオトラックと時間的に同期した別個のプレーヤーとして実装されます。



その結果、まだリリースできない別の機能があります。これは、アルバム内の一部のビデオの元のオーディオの効果です。 アルバム内のいくつかのビデオがサウンドトラックを重ねて再生され、ビデオ自体の音が聞こえなくなり、その後、サウンドトラックが停止して聞こえるようになります。たとえば、ビデオで話している内容、サウンドトラックが再びフル音量でオンになり、再生が継続します。 繰り返しになりますが、この機能で遊ぶための更新を楽しみにしています。



性能

デバイスでビデオをトランスコードすることを決定する前に、主要な疑問が生じました。それは、リソースによってユーザーにどれだけのコストがかかるかです。 既存のデバイスでいくつかのテストを実施し、手術に必要な時間とバッテリーのコストを測定しました。 結果を以下に示します。







要約すると、要するに

INDEの導入前後のデバイスでのビデオ処理のプロセスは、天と地で異なります。 通常、低レベルのツールから高レベルのツールに切り替える場合、プログラマは高レベルのライブラリが提供する可能性によって制限されます。 INDEの場合、これはまったくそうではなく、逆に、より多くの機会があり、それらの実装に必要な時間が大幅に短くなります。 開発者にとって、最も楽しい部分だけが残っています-アーキテクチャを考え、UIを改善し、ビデオまたはオーディオエフェクトをカスタマイズします。 Cコードに没頭する必要はありません。特定のデバイスに応じて、マルチプレクサーとデマルチプレクサーと予期しない結果を処理します。



もちろん、改善して修正したい点がいくつかありますが、Intelの開発者に敬意を表さなければなりません。彼らは喜んでそのような要望に耳を傾け、速やかに修正します。



有用なソース

インテルのWebサイトで完全で理解しやすいソースコードを見つけることができるため、この記事では非常に短い例を具体的に示しています。 software.intel.com/en-us/articles/intel-inde-media-pack-for-android-tutorials



All Articles