Android Video Watermarking - Einfache Anwendung von FFmpeg

Die Videoverarbeitung ist eine häufige Anforderung in der Android-Entwicklung. Wie Video-Wasserzeichen, Konvertierung von Videoformaten, Video-Screenshots usw.

FFmpeg ist ein weit verbreitetes Tool zur Videobearbeitung.Im Allgemeinen können Sie den FFmpeg-Quellcode verwenden, um es selbst zu kompilieren, oder Sie können das von anderen im Internet kompilierte Paket verwenden. Hier verwende ich die letztere Lösung.

Ich habe den verwendet, den ich auf GitHub gefunden habe . Natürlich sind auch andere von FFmpeg kompilierte Pakete verfügbar.

Die Idee, Video oder Audio mit FFmepg zu verarbeiten, ist:

  1. Laden Sie die FFmpeg-Umgebung
  2. Schreiben Sie FFmpeg-Verarbeitungsbefehle
  3. Verarbeitungsbefehl ausführen
  4. Warten Sie, bis das Ergebnis zurückgegeben wird

1. Führen Sie zuerst Abhängigkeiten eincompile 'com.writingminds:FFmpegAndroid:0.3.2'

2. Dann müssen Sie es laden, bevor Sie FFmpeg verwenden

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. Dann können Sie den Befehl ausführen, z. B. den folgenden 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
}
复制代码

Hier ist ein Beispiel für das Hinzufügen eines Wasserzeichens zu einem Video:

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)
}
复制代码

Hier eine kurze Erklärung der verwendeten Befehle:

  • -y Ausgabedatei überschreiben
  • -I Dateiname Eingabedatei, Hinweis: Hier werden zwei Eingabedateien verwendet, nämlich Videodatei und Wasserzeichenbilddatei
  • -filter_complex "filter map" Multi-Input-Filter, Filter-Map enthält mehrere Filterketten, getrennt durch Semikolons; Filterkette enthält mehrere Filter, kommagetrennt, wobei overlay=X:Y das Video abdeckt, erfordert zwei Eingänge, der zweite wird überlagert an der ersten Position (X, Y), Y kann weggelassen werden, [0:v][1:v] ist die Referenz der ersten und zweiten Eingabe als Eingabeanweisung
左上角: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 gibt den Videodecodierer an Hinweis: Der hier eingegebene Videocode ist H264, verwenden Sie also 264-Decodierung.
  • -codec:a gibt an, dass die Kopie des Audiodecoders dasselbe bedeutet wie die Eingangsquelle

Hinweis: Die Eingabe- und Ausgabedateien sind hier alle lokale Pfade

Wenn FFmpeg die Verarbeitung beendet hat, ruft es zurück onSuccessund wir können die Ausgabedatei hier zurückgeben.

Funktionen wie Videozusammenführung , Audioextraktion , Videokomprimierung usw. sind in etwa gleich. Der Unterschied besteht darin, dass der Befehl cmd anders verwendet wird.Bei der Implementierung bestimmter Funktionen können Sie mehr über die spezifischen Befehle im Detail erfahren.

Supongo que te gusta

Origin juejin.im/post/7098900938840080420
Recomendado
Clasificación