214

AndroidでFFmpegをコンパイルしました(libffmpeg.so)。ここで、RockPlayer のようなアプリケーションを作成するか、既存の Android マルチメディア フレームワークを使用して FFmpeg を呼び出す必要があります。

  1. Android/StageFright に FFmpeg を統合するための手順/手順/コード/例はありますか?

  2. このライブラリをマルチメディア再生に使用する方法を教えてください。

  3. オーディオとビデオのトランスポート ストリームが既にあるという要件があり、これを FFmpeg にフィードしてデコード/レンダリングする必要があります。IOMX API は OMX ベースであり、ここで FFmpeg をプラグインできないため、Android でこれを行うにはどうすればよいですか?

  4. また、再生に使用する必要がある FFmpeg API に関するドキュメントも見つかりませんでした。

4

10 に答える 10

110

Androidでffmpegを動作させるために行った手順は次のとおりです。

  1. Android 用の ffmpeg の静的ライブラリをビルドします。これは、 Android Build Systemを使用して、 olvaffe の ffmpeg android ポート ( libffmpeg ) をビルドすることによって実現されました。ソースを /external の下に配置するだけです。ffmpeg ライブラリが依存しているため、Android ビルドからも bionic(libc) と zlib(libz) を抽出する必要があります。make
  2. Android NDKを使用して、ffmpeg 機能をラップする動的ライブラリを作成します。NDK の操作方法に関するドキュメントは多数あります。基本的に、必要な機能を ffmpeg から Java が JNI を介して対話できるライブラリにエクスポートするには、いくつかの C/C++ コードを記述する必要があります。NDK を使用すると、手順 1 で生成した静的ライブラリに簡単にリンクできます。次のような行を Android.mk に追加するだけです。LOCAL_STATIC_LIBRARIES := libavcodec libavformat libavutil libc libz

  3. Java ソースから ffmpeg-wrapping 動的ライブラリを使用します。JNI に関する十分なドキュメントがそこにあるので、問題ないはずです。

再生に ffmpeg を使用することについては、多くの例があります (ffmpeg バイナリ自体が良い例です)。ここでは、基本的なチュートリアルを示します。最高のドキュメントはヘッダーにあります。

幸運を :)

于 2011-01-27T18:26:35.823 に答える
70

さまざまな理由から、効率を犠牲にすることなくタスクを達成するという点で、マルチメディアは簡単でしたし、決して簡単ではありません。ffmpeg は、日々改善するための努力です。さまざまな形式のコーデックとコンテナーをサポートしています。

このライブラリをどのように使用するかという質問に答えるために、ここに書くのはそれほど簡単ではないと思います。しかし、私は次の方法であなたを導くことができます.

1) ソースコードの ffmpeg ディレクトリ内に、output_example.cまたはapi_example.cがあります。ここでは、エンコード/デコードが行われるコードを確認できます。ffmpeg 内のどの API を呼び出す必要があるかがわかります。これが最初のステップになります。

2) Dolphin プレーヤーは、Android 用のオープン ソース プロジェクトです。現在、バグがありますが、開発者は継続的に作業しています。そのプロジェクトでは、調査を続行するために使用できるセットアップ全体の準備が整いました。code.google.com からのプロジェクトへのリンクを次に示します。または、ターミナルでコマンド「git clone https://code.google.com/p/dolphin-player/」を実行します。P および P86 という名前の 2 つのプロジェクトが表示されます。どちらでも使用できます。

私が提供したい追加のヒントは、ffmpeg コードをビルドするときに、build.sh 内で、使用する形式のマルチプレクサ/デマルチプレクサ/エンコーダ/デコーダを有効にする必要があることです。それ以外の場合、対応するコードはライブラリに含まれません。これに気付くのにかなりの時間がかかりました。だからあなたとそれを共有することを考えました。

いくつかの基本: ビデオ ファイルと言う場合、例: avi、オーディオとビデオの両方の組み合わせです。

動画ファイル=動画+音声


ビデオ = コーデック + マルチプレクサ + デマルチプレクサ

コーデック = エンコーダー + デコーダー

=>ビデオ = エンコーダー + デコーダー + マルチプレクサー + デマルチプレクサー(Mpeg4 + Mpeg4 + avi +avi - avi コンテナーの例)


オーディオ = コーデック + マルチプレクサ + デマルチプレクサ

コーデック = エンコーダー + デコーダー

=>オーディオ = エンコーダー + デコーダー + マルチプレクサー + デマルチプレクサー(mp2 + mp2 + avi + avi - avi コンテナーの例)


コーデック (名前は en*co*der/*dec*oder の組み合わせから派生したもの) は、フレームのエンコード/デコードに使用されるアルゴリズムを定義するフォーマットの一部です。AVI はコーデックではなく、Mpeg4 のビデオ コーデックと mp2 のオーディオ コーデックを使用するコンテナです。

マルチプレクサ/デマルチプレクサは、エンコード/デコード中に使用されるファイルからフレームを結合/分離するために使用されます。

したがって、avi 形式を使用する場合は、ビデオ コンポーネント + オーディオ コンポーネントを有効にする必要があります。

たとえば、avi の場合、次を有効にする必要があります。mpeg4 エンコーダー、mpeg4 デコーダー、mp2 エンコーダー、mp2 デコーダー、avi マルチプレクサー、avi デマルチプレクサー。

ふぇぇぇぇぇぇぇぇぇぇぇ…

プログラム的には、build.sh に次のコードを含める必要があります。

--enable-muxer=avi --enable-demuxer=avi (Generic for both audio/video. generally Specific to a container)
--enable-encoder=mpeg4 --enable-decoder=mpeg4(For video support)
--enable-encoder=mp2 --enable-decoder=mp2 (For Audio support)

これ以上あなたを混乱させないことを願っています...

ありがとう、助けが必要な場合はお知らせください。

于 2012-03-27T08:32:49.670 に答える
13

私が見つけた最も構築しやすく使いやすい実装は、ガーディアン プロジェクト チームによって作成されました: https://github.com/guardianproject/android-ffmpeg

于 2012-10-31T11:15:18.217 に答える
11

Android NDK を使用して X264 と FFMPEG を構成およびビルドするための小さなプロジェクトを作成しました。欠けている主なものは、Java 経由でアクセスできるようにする適切な JNI インターフェイスですが、それは (比較的) 簡単な部分です。JNI インターフェースを自分の用途に適したものにできるようになったら、それを押し込みます。

Olvaffe のビルド システムに対する利点は、ライブラリをビルドするために Android.mk ファイルを必要とせず、通常の makefile とツールチェーンを使用するだけであることです。これにより、FFMPEG または X264 から新しい変更を取得するときに、動作が停止する可能性が大幅に低くなります。

https://github.com/halfninja/android-ffmpeg-x264

于 2011-06-24T11:33:30.493 に答える
3

このプロジェクトが言及されていないのは奇妙です: AndroidFFmpeg from Appunite

私のような怠惰な人のために、コマンドラインにコピー/貼り付けするための非常に詳細な段階的な手順があります))

于 2014-11-28T15:04:40.680 に答える
3

私は同じ問題を抱えていました。ここでの回答のほとんどが古くなっていることがわかりました。最終的に、1 行のコードで Android からアクセスするための FFMPEG のラッパーを作成しました。

https://github.com/madhavanmalolan/ffmpegandroidlibrary

于 2017-10-27T11:12:49.673 に答える