191

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

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

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

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

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


  • これは面白いです、私も興味があります - Axarydax
  • どのようにしてfsopegをコンパイルして.soファイルを取得しましたか?あなたが従ったステップを共有してください。私はcygwin-1.7.9とndk r5でwindowsに取り組んでいます。私を助けてください。 - Swathi EP
  • これがAndroid用の比較的新しいFFmpegです。sourceforge.net/projects/ffmpeg4android - slhck
  • @ slhck私は上記のリンクからffmpegのコードをダウンロードし、それをコンパイルしようとしましたが、私は.soファイルを入手することができません。それは多くの問題を示しています。 - RAJESH
  • 私を助けてください:stackoverflow.com/questions/14157030/…、この関数をどこに含めて実行するかわからない!..... - TharakaNirmana

9 답변


102

これが私がffmpegをAndroid上で動作させるためのステップです。

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

  3. あなたのJavaソースからffmpegラッピング動的ライブラリを使用してください。 JNIに関する十分なドキュメントがありますので、大丈夫です。

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

がんばろう :)


  • Android用のffmpegを構築するためのこの回答へのリンクはかなりあります。これはまだ最善の解決策ですか? Android Build Systemのリンクが壊れています。 NDKを構築するのに役立つたくさんのツールキットがあります。しかし、それらはすべて私にとってさまざまなビルドエラーで失敗し、少し古そうに見えます。誰かがビルドされた静的ffmpeg libを投稿するだけではいけない理由はありますか? - Rob Lourens
  • 私自身の質問に答えるために、私はこのレポがffmpegとJNIラッパーを構築するのに最も有用であることがわかりました - github.com/andynicholson/android-ffmpeg-x264 - Rob Lourens

63

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

今の質問に答えるためにこのライブラリの使い方、それをここに書くのはそれほど単純ではないと言うでしょう。しかし、私はあなたを導くことができます以下の方法

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

2)イルカプレーヤーは、Android用のオープンソースプロジェクトです。現在はバグがありますが、開発者は継続的に取り組んでいます。そのプロジェクトでは、あなたはあなたがあなたの調査を続けるのに使用できる全体の準備ができています。これはへのリンクです。プロジェクトcode.google.comから、またはコマンドを実行します」gitクローンhttps://code.google.com/p/dolphin-player/"端末で。PとP86という名前の2つのプロジェクトを見ることができます。どちらか一方を使うことができます。

あなたがffmpegコードをビルドしているとき、build.shの中であなたが使用したいフォーマットのmuxers / demuxers / encoder / decodersを有効にする必要があるということを私が提供したいと思う特別なヒントです。そうでなければ、対応するコードはライブラリに含まれません。私がこれを理解するのはとても時間がかかりました。だからあなたとそれを共有することを考えた。

基本はほとんどありません。我々がビデオファイルを言うとき、例:avi、それはオーディオとビデオの両方の組み合わせです

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


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

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

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


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

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

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


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

マルチプレクサ/デマルチプレクサは、符号化/復号化中に使用されるファイルからフレームを結合/分離するために使用される。

あなたがaviフォーマットを使いたいのであれば、あなたはビデオコンポーネント+オーディオコンポーネントを有効にする必要があります。

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

phewwwwwww ...

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

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

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


  • こんにちは、私はその情報に本当に感謝したいと思います、あなたは本当に私をとても助けてくれました、後で私がいくらか必要になるなら、あなたは私を助けることが可能ですか?ありがとうございました! - idish
  • skype / MSNまたは他のチャットプラットフォームでお願いしますか。私はそれについていくつか質問があります、ありがとう。 - idish
  • 確かに..!しかし、私のオンラインプレゼンスは少し低いです..それが非常に必要とされない限り私はスカイプにログインしません。あなたは私にどんな重要なことでも郵送することができます。 Eメール:mantykuma@gmail.com - mk..

11

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


  • これがMac 10.8.5で動作することを確信しています。 - Mr.G
  • 確かではない、私はそれがそうであることを推測している、新しいiOSのバージョンでこれを壊すかもしれない何も頭に浮かんで来ない。これを投稿したとき、私はまだ10.7か10.6を持っていました - Guy
  • JNI実装を使用して、3GPをオーディオに変換する方法はありますか - Mr.G

10

私はAndroid NDKを使ってX264とFFMPEGを設定して構築するための小さなプロジェクトをやった。欠けている主なものは、Java経由でアクセス可能にするためのまともなJNIインターフェースですが、それは(比較的)簡単な部分です。 JNIインターフェースを自分の用途に適したものにすることに慣れると、それをプッシュします。

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

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


  • Nick、あなたのプロジェクトはOS X 10.7 libx264.a(common.o)でコンパイルされていません:機能的にはx264_param_parse': common.c:(.text+0x2864): undefined reference to _DefaultRuneLocale' collect2:ldが1つの終了ステータスmakeを返しました:*** [x264]エラー1 - Yuriy Solovyov

5

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

より詳しい情報http://hiteshsondhi88.github.io/ffmpeg-android-java/


  • このラッパーはとてもとてもとても遅いです。ビデオに200画像は50〜60秒かかります。 。 。しかし、通常ffmpegは4〜5秒でそのタスクを処理します。 - Arsen Sench
  • このプロジェクトはもう働いていません。他に資料がありますか。 - Ajeet
  • @ArsenSench他に解決策がありますか? - Akash Dubey

3

そこにAndroidの実装上の他の多くのFFmpeg(主にグアディアンプロジェクト)、私は解決策を見つけた(ラメサポートも)。

(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.
        }
    }
}


  • guardianprojectでのあなたの経験は何ですか? - x.y

2

このプロジェクトが言及されていないのは不思議です。AppuniteからAndroidFFmpeg

それは私のような怠惰な人々のために、コマンドラインにコピー/ペーストするための非常に詳細なステップバイステップの説明を持っています)


2

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

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

  • 現時点では使用していますFFmpeg release n4.0-39-gda39990
  • FFmpegとFFProbeを含みます
  • コマンドを起動するためのJavaインターフェースが含まれています
  • FFprobeまたはFFmpegはAPKから削除される可能性があります。ウィキをチェックしてください。https://github.com/bravobit/FFmpeg-Android/wiki


  • はい、これは動作しています..フラッターアプリのためにそれを使用して - UpaJah

1

私は同じ問題を抱えていた、私はここに答えのほとんどが時代遅れであることがわかった。 私は単一行のコードでAndroidからアクセスするためにFFMPEGのラッパーを書いてしまいました。

https://github.com/madhavanmalolan/ffmpegandroidlibrary


リンクされた質問


関連する質問

最近の質問