私はAndroid上でFFmpegをコンパイルしました(libffmpeg.so)。今私はRockPlayerのようなアプリケーションを構築するか、既存のAndroidマルチメディアフレームワークを使用してFFmpegを起動する必要があります。
Android / StageFrightにFFmpegを統合する手順/手順/コード/例はありますか?
このライブラリをマルチメディア再生に使用する方法について教えてください。
私はすでにオーディオとビデオのトランスポートストリームを持っていて、それをFFmpegにフィードしてデコード/レンダリングさせる必要があります。 IOMX APIはOMXベースであり、ここではFFmpegをプラグインできないため、Androidでこれを実行するにはどうすればよいですか。
また、再生に使用する必要があるFFmpeg APIに関するドキュメントが見つかりませんでした。
これが私がffmpegをAndroid上で動作させるためのステップです。
make
離れて。 ffmpegライブラリはそれらに依存しているため、Androidビルドからもbionic(libc)とzlib(libz)を抽出する必要があります。Androidを使用してffmpeg機能をラッピングした動的ライブラリを作成します。NDK。 NDKを使用する方法についてはたくさんのドキュメントがあります。基本的には、ffmpegから必要な機能を、JavaがJNIを通して対話できるライブラリにエクスポートするためのC / C ++コードを書く必要があります。 NDKを使用すると、手順1で生成した静的ライブラリに簡単にリンクできます。Android.mkに次のような行を追加するだけです。LOCAL_STATIC_LIBRARIES := libavcodec libavformat libavutil libc libz
あなたのJavaソースからffmpegラッピング動的ライブラリを使用してください。 JNIに関する十分なドキュメントがありますので、大丈夫です。
再生にffmpegを使用することに関しては、多くの例があります(ffmpegバイナリ自体が良い例です)。ここには基本的なチュートリアルです。最良の文書はヘッダにあります。
がんばろう :)
さまざまな理由から、マルチメディアは効率を犠牲にすることなくタスクを達成するという点では決して容易ではありませんでした。 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がこのすべての後にあなたをもっと混乱させないことを願っています...
ありがとう、どんな援助も必要でした、私に知らせてください。
私はAndroid NDKを使ってX264とFFMPEGを設定して構築するための小さなプロジェクトをやった。欠けている主なものは、Java経由でアクセス可能にするためのまともなJNIインターフェースですが、それは(比較的)簡単な部分です。 JNIインターフェースを自分の用途に適したものにすることに慣れると、それをプッシュします。
olvaffeのビルドシステムを超える利点は、ライブラリをビルドするのにAndroid.mkファイルを必要としないことです。通常のmakefileとツールチェーンを使用するだけです。これは、あなたがFFMPEGまたはX264から新しい変更を引っ張ったときに動作を停止する可能性がはるかに低くなります。
https://github.com/halfninja/android-ffmpeg-x264
x264_param_parse': common.c:(.text+0x2864): undefined reference to
_DefaultRuneLocale' collect2:ldが1つの終了ステータスmakeを返しました:*** [x264]エラー1 - Yuriy Solovyov
私のFFMPEGアプリケーションを作るために、私はこのプロジェクトを使いました(https://github.com/hiteshsondhi88/ffmpeg-android-javaだから、私は何もコンパイルする必要はありません。私たちのAndroidアプリケーションでFFMPEGを使うのは簡単な方法だと思います。
より詳しい情報http://hiteshsondhi88.github.io/ffmpeg-android-java/
そこに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.
}
}
}
このプロジェクトが言及されていないのは不思議です。AppuniteからAndroidFFmpeg
それは私のような怠惰な人々のために、コマンドラインにコピー/ペーストするための非常に詳細なステップバイステップの説明を持っています)
多くの調査の結果、今これが私が見つけたAndroid用の最新のコンパイル済みライブラリです。
https://github.com/bravobit/FFmpeg-Android
FFmpeg release n4.0-39-gda39990
私は同じ問題を抱えていた、私はここに答えのほとんどが時代遅れであることがわかった。 私は単一行のコードでAndroidからアクセスするためにFFMPEGのラッパーを書いてしまいました。
https://github.com/madhavanmalolan/ffmpegandroidlibrary