web-dev-qa-db-ja.com

Android上のFFmpeg

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

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

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

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

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

198
Jag

以下は、ffmpegをAndroidで動作させるために行った手順です。

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

  3. Javaソースからffmpeg-wrapping動的ライブラリを使用します。 JNIには十分なドキュメントがありますが、大丈夫です。

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

がんばろう :)

104
yonilevy

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

このライブラリの使用方法の質問に答えるために、そうではないと言うでしょうここに書くのは簡単です。しかし、私はあなたを以下の方法で案内することができます.

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

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

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

いくつかの基本:ビデオファイル、ex:aviと言うとき、それはオーディオとビデオの両方の組み合わせです

ビデオファイル=ビデオ+オーディオ


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

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

=>ビデオ=エンコーダー+デコーダー+ Muxer + Demuxer(Mpeg4 + Mpeg4 + avi + avi-aviコンテナーの例)


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

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

=>オーディオ=エンコーダー+デコーダー+ Muxer + Demuxer(mp2 + mp2 + avi + avi-aviコンテナーの例)


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

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

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

たとえば、aviの場合、次を有効にする必要があります。 mpeg4エンコーダー、mpeg4デコーダー、mp2エンコーダー、mp2デコーダー、avi muxer、avi demuxer。

わーいwwwwww ...

プログラムで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)

私はこれの後にあなたをもっと混乱させないことを願っています...

ありがとう、どんな援助も必要です、私に知らせてください。

66
mk..

私が見つけた最も簡単で使いやすい実装は、theguardianprojectチームによって作成されました: https://github.com/guardianproject/Android-ffmpeg

12
Guy

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

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

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

11
Nick

多くの調査の結果、今のところ、これは私が見つけたAndroid用の最新のコンパイル済みライブラリです。

https://github.com/bravobit/FFmpeg-Android

  • 現時点ではFFmpeg release n4.0-39-gda39990を使用しています
  • FFmpegとFFProbeが含まれています
  • コマンドを起動するJavaインターフェイスが含まれています
  • FFprobeまたはFFmpegはAPKから削除できます。wikiを確認してください https://github.com/bravobit/FFmpeg-Android/wiki
7
Aracem

FFMPEGアプリケーションを作成するには、このプロジェクトを使用しました( https://github.com/hiteshsondhi88/ffmpeg-Android-Java )。したがって、何もコンパイルする必要はありません。 AndroidアプリケーションでFFMPEGを使用する簡単な方法だと思います。

http://hiteshsondhi88.github.io/ffmpeg-Android-Java/ の詳細

6
jmartinalonso

Android実装に関する他の多くのFFmpeg(主に guadianproject )に触発され、解決策が見つかりました(Lameサポートもあります)。

(lameおよびFFmpeg: https://github.com/intervigilium/liblame および http://bambuser.com/opensource

fFmpegを呼び出すには:

new Thread(new Runnable() {

    @Override
    public void run() {

        Looper.prepare();

        FfmpegController ffmpeg = null;

        try {
            ffmpeg = new FfmpegController(context);
        } catch (IOException ioe) {
            Log.e(DEBUG_TAG, "Error loading ffmpeg. " + ioe.getMessage());
        }

        ShellDummy Shell = new ShellDummy();
        String mp3BitRate = "192";

        try {
            ffmpeg.extractAudio(in, out, audio, mp3BitRate, Shell);
        } catch (IOException e) {
            Log.e(DEBUG_TAG, "IOException running ffmpeg" + e.getMessage());
        } catch (InterruptedException e) {
            Log.e(DEBUG_TAG, "InterruptedException running ffmpeg" + e.getMessage());
        }

        Looper.loop();

    }

}).start();

コンソール出力を処理するには:

private class ShellDummy implements ShellCallback {

    @Override
    public void shellOut(String shellLine) {
        if (someCondition) {
            doSomething(shellLine);
        }
        Utils.logger("d", shellLine, DEBUG_TAG);
    }

    @Override
    public void processComplete(int exitValue) {
        if (exitValue == 0) {
            // Audio job OK, do your stuff: 

                            // i.e.             
                            // write id3 tags,
                            // calls the media scanner,
                            // etc.
        }
    }

    @Override
    public void processNotStartedCheck(boolean started) {
        if (!started) {
                            // Audio job error, as above.
        }
    }
}
4
dentex

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

私のような怠zyな人のために、コマンドラインにコピー/ペーストするための非常に詳細なステップバイステップの手順があります))

3
Mixaz

私は同じ問題を抱えていた、私はここで日付の答えのほとんどを見つけました。結局、1行のコードでAndroidからアクセスするためにFFMPEGにラッパーを書くことになりました。

https://github.com/madhavanmalolan/ffmpegandroidlibrary

2