15

質問:

アプリケーションプライベートファイルのビデオサムネイルを取得するにはどうすればよいですか?具体的には、.mpegファイルからビデオフレームを直接抽出する方法はありますか?

バックグラウンド:

  1. 私のアプリケーションには、ビデオを録画できるカメラが含まれています。
  2. 製品上の理由から、ビデオファイルは最初に作成され、アプリケーションのプライベートデータディレクトリにプライベートモードで書き込まれ、アプリケーションに対してプライベートになります。これは次を使用して行われます。-Context#openFileOutput(fileName, Context.MODE_PRIVATE)一般的なファイルパスは次のようになります/data/data/[package.name]/files/[fileName].mp4。-参考までにContext.MODE_WORLD_READABLE、代わりに使用してみContext.MODE_PRIVATEましたが、役に立ちませんでした。
  3. ビデオは最終的に(ファイルをに移動することによりEnvironment#getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES)外部ストレージに保存される可能性がありますが、ビデオがアプリケーションプライベートストレージにある間はサムネイルを表示する必要があります。
  4. ファイルがパブリックディレクトリに移動された後(MediaStoreに追加されているかどうかに関係なく)、ファイルは正常に機能しているように見えますが、ファイルが内部ストレージにある場合はThumbnailUtils.createVideoThumbnail(String, int)サイレントに失敗します(戻ります)。null

    • 注:ビデオファイルがアプリケーションプライベートストレージにある限り、MediaStoreに追加されません(デバイスギャラリーの画像/ビデオコンテンツプロバイダーがフィードします)。ビデオが外部ストレージに移動されたら、MediaStoreに追加します。これは製品に関連する決定であり、私はこれを回避することはできません。他のアプリに表示されずにメディアストアにビデオを追加する方法がない限り...アプリケーションプライベートストレージ内のビデオをメディアストアに追加して、アプリケーションプライベートのままにして、すべての無料の「サービス」を利用できるかどうか疑問に思います。 「サムネイル生成などのメディアストアから提供されます。
4

4 に答える 4

3

もちろん、プライベート メディアに MediaStore のものを使用することはできません。可能であれば、画像処理ライブラリを使用します。フレームを抽出/サイズ変更することで、OpenCVが簡単にできることを知っています。- 2ページの中段をご覧ください。

于 2012-01-02T03:48:17.747 に答える
2

ほとんどのメディアAPIは、独自のプロセスで実行されるメディアサーバーの単なるバインダークライアントです。ファイルを一時的に公開してみてください。

于 2012-01-04T19:01:25.540 に答える
1

以下のAPIを試してみましたか?

MediaMetadataRetriever::getFrameAtTime() 、Android-developer-page-MediaMetadataRetriever を参照

サンプルコード:

MediaMetadataRetriever retriever = new MediaMetadataRetriever();
try {
retriever.setDataSource(filePath);
bitmap = retriever.getFrameAtTime(0, MediaMetadataRetriever.OPTION_CLOSEST);
} catch (IllegalArgumentException ex) {
// Assume this is a corrupt video file
} catch (RuntimeException ex) {
// Assume this is a corrupt video file. }

上記のコードはうまくいきました!! 私のファイルはパブリックフォルダーでアクセスできます。

于 2012-01-04T05:36:34.057 に答える