ビデオ処理は、Android開発の一般的な要件です。ビデオ透かし、ビデオフォーマット変換、ビデオスクリーンショットなど...
FFmpegは、ビデオ処理で一般的に使用されるツールです。通常、FFmpegソースコードを使用して自分でコンパイルするか、インターネット上の他のユーザーがコンパイルしたパッケージを使用できます。ここでは、後者のソリューションを使用します。
GitHubで見つけたものを使用しました。もちろん、FFmpegによってコンパイルされた他のパッケージも利用できます。
FFmepgでビデオまたはオーディオを処理するアイデアは次のとおりです:
- FFmpeg環境をロードする
- FFmpeg処理コマンドを書く
- 処理コマンドを実行する
- 結果が返されるのを待つ
1.まず、依存関係を導入しますcompile 'com.writingminds:FFmpegAndroid:0.3.2'
2.次に、FFmpegを使用する前にロードする必要があります
FFmpeg ffmpeg = FFmpeg.getInstance(context);
try {
ffmpeg.loadBinary(new LoadBinaryResponseHandler() {
@Override
public void onStart() {}
@Override
public void onFailure() {}
@Override
public void onSuccess() {}
@Override
public void onFinish() {}
});
} catch (FFmpegNotSupportedException e) {
// Handle if FFmpeg is not supported by device
}
复制代码
3.次に、次のcmdなどのコマンドを実行できます。
FFmpeg ffmpeg = FFmpeg.getInstance(context);
try {
// to execute "ffmpeg -version" command you just need to pass "-version"
ffmpeg.execute(cmd, new ExecuteBinaryResponseHandler() {
@Override
public void onStart() {}
@Override
public void onProgress(String message) {}
@Override
public void onFailure(String message) {}
@Override
public void onSuccess(String message) {}
@Override
public void onFinish() {}
});
} catch (FFmpegCommandAlreadyRunningException e) {
// Handle if FFmpeg is already running
}
复制代码
ビデオに透かしを追加する例を次に示します。
val convertedFile = getConvertedFile(inFile!!)//输出文件路径
val cmd = arrayOf(
"-y",
"-i",
inFile!!.path,
"-i",
watermarkFile!!.absolutePath,
"-filter_complex",
"[0:v][1:v]overlay=main_w-overlay_w-10:10",
"-vcodec",
"libx264",
"-codec:a",
"copy",
convertedFile.path
)
try {
FFmpeg.getInstance(context).execute(cmd, object : FFmpegExecuteResponseHandler {
override fun onStart() {}
override fun onProgress(message: String) {
Log.e("TAg", "水印:$message")
}
override fun onSuccess(message: String) {
Log.e("TAg", "成功:$message")
inFile?.delete();
watermarkFile?.delete();
callback?.onSuccess(convertedFile)
}
override fun onFailure(message: String) {
callback?.onFailure(IOException(message))
}
override fun onFinish() {
Log.e("TAg", "结束")
}
})
} catch (e: Exception) {
callback?.onFailure(e)
}
复制代码
使用されるコマンドの簡単な説明は次のとおりです。
- -y出力ファイルを上書きします
- -Iファイル名入力ファイル、注:ここでは、ビデオファイルと透かし画像ファイルの2つの入力ファイルが使用されます。
- -filter_complex "filter map"マルチ入力フィルター、フィルターマップにはセミコロンで区切られた複数のフィルターチェーンが含まれます;フィルターチェーンには複数のフィルターが含まれ、overlay = X:Yがビデオをカバーし、2つの入力が必要で、2番目の入力がオーバーレイされます。最初の位置(X、Y)では、Yは省略できます。[0:v] [1:v]は、入力命令としての1番目と2番目の入力の参照です。
左上角:overlay=10:10
右上角:overlay=main_w-overlay_w-10:10
左下角:overlay=10:main_h-overlay_h-10
右下角:overlay=main_w-overlay_w-10:main_h-overlay_h-10
复制代码
- -vcodecはビデオデコーダーを指定します。注:ここで入力されるビデオコードはH264であるため、264デコードを使用します。
- -codec:aは、オーディオデコーダーのコピーが入力ソースと同じ意味であることを指定します
注:ここでの入力ファイルと出力ファイルはすべてローカルパスです
FFmpegの処理が終了すると、コールバックさonSuccess
れ、ここで出力ファイルを返すことができます。
ビデオのマージ、オーディオの抽出、ビデオの圧縮などの機能はほぼ同じです。違いは、cmdコマンドの使用方法が異なることです。特定の機能を実装すると、特定のコマンドについて詳しく知ることができます。