Androidビデオ透かし-FFmpegのシンプルなアプリケーション

ビデオ処理は、Android開発の一般的な要件です。ビデオ透かし、ビデオフォーマット変換、ビデオスクリーンショットなど...

FFmpegは、ビデオ処理で一般的に使用されるツールです。通常、FFmpegソースコードを使用して自分でコンパイルするか、インターネット上の他のユーザーがコンパイルしたパッケージを使用できます。ここでは、後者のソリューションを使用します。

GitHubで見つけたものを使用しましたもちろん、FFmpegによってコンパイルされた他のパッケージも利用できます。

FFmepgでビデオまたはオーディオを処理するアイデアは次のとおりです:

  1. FFmpeg環境をロードする
  2. FFmpeg処理コマンドを書く
  3. 処理コマンドを実行する
  4. 結果が返されるのを待つ

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コマンドの使用方法が異なることです。特定の機能を実装すると、特定のコマンドについて詳しく知ることができます。

おすすめ

転載: juejin.im/post/7098900938840080420