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:
- Laden Sie die FFmpeg-Umgebung
- Schreiben Sie FFmpeg-Verarbeitungsbefehle
- Verarbeitungsbefehl ausführen
- 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 onSuccess
und 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.