Я использую ffmpeg-android для объединения двух видеофайлов, но объединение занимает слишком много времени, и я предполагаю, что это из-за использования "-filter_complex", но это была единственная команда, которую я нашел в Интернете, может кто-нибудь упростить приведенную ниже команду? Я просто хочу объединить два видеофайла, захваченных API-интерфейсом camera2, без каких-либо изменений.
String command[] = new String[]{
"-y",
"-i", firstPath,
"-i", secondPath,
"-strict",
"experimental",
"-filter_complex",
"[0:v]scale=iw*min(1920/iw\\,1080/ih):ih*min(1920/iw\\,1080/ih)," +
"pad=1920:1080:(1920-iw*min(1920/iw\\,1080/ih))/2:(1080-ih*min(1920/iw\\,1080/ih))/2,setsar=1:1[v0];[1:v] scale=iw*min(1920/iw\\,1080/ih):ih*min(1920/iw\\,1080/ih)," +
"pad=1920:1080:(1920-iw*min(1920/iw\\,1080/ih))/2:(1080-ih*min(1920/iw\\,1080/ih))/2,setsar=1:1[v1];[v0][0:a][v1][1:a] concat=n=2:v=1:a=1",
"-ab", "48000", "-ac", "2", "-ar", "22050", "-s", "1920x1080", "-vcodec", "libx264", "-crf", "27", "-q", "4", "-preset", "ultrafast", getVideoFilePath(getActivity())};
commandFFMPEG(command);
private void commandFFMPEG(String command[]) {
FFmpeg ffmpeg = FFmpeg.getInstance(getActivity());
try {
ffmpeg.execute(command, new ExecuteBinaryResponseHandler() {
@Override
public void onStart() {
startTime = System.currentTimeMillis();
}
@Override
public void onProgress(String message) {
}
@Override
public void onFailure(String message) {
}
@Override
public void onSuccess(String message) {
long endTime = System.currentTimeMillis();
long result = endTime - startTime;
Toast.makeText(getActivity(), "Videos are merged", Toast.LENGTH_SHORT).show();
}
@Override
public void onFinish() {
}
});
} catch (FFmpegCommandAlreadyRunningException e) {
// Handle if FFmpeg is already running
}
}
Idk поможет вам, но когда я хотел объединить видео с ffmpeg, я использовал эту команду:
StringBuilder builder = new StringBuilder();
builder.append("-f ");
builder.append("concat ");
builder.append("-safe 0 ");
builder.append("-i ");
final String tempFile = getTextFile().getAbsolutePath();//it is text file with video files paths
builder.append(tempFile);
builder.append(" ");
builder.append("-c ");
builder.append("copy ");
builder.append(saveFile);// saveFile - it is your output file
В любом случае, на обработку конкатенационных роликов общей длительностью 20 секунд уходит ~ 20 секунд. Можете посмотреть здесь, я написал его для конкатенации нескольких роликов, но качество кода ужасное, не знаю, поймете ли вы что-то там. Надеюсь, это вам поможет)
Спасибо за ответ, но я получаю [concat @ 0xf4627000] Impossible to open '/storage/emulated/0/Android/data/com.example.user.camerademo/files/null' /storage/emulated/0/Android/data/com.example.user.camerademo/files/inputFiles.txt: No such file or directory в onFailure
Вы видели, как я сделал getTextFile () в репозитории git и сделал то же самое? Или попробуйте то же самое, что и раньше, без текстового файла, но с -i firstFile -i secondFile
Да, я скопировал тот же метод и дал свой массив путей к файлам, например. /storage/emulated/0/Android/data/com.example.user.camerademo / files / 1532695230219 .mp4
Затем попробуйте свой первый подход с 2 -i, я сделал это в текстовом файле, потому что у меня могло быть другое количество видео.
Хорошо, не могли бы вы сказать мне, что я должен добавить после `" -i ", secondPath,`
-i pathToYourVideoFile (или AbsolutePath не помню) - он скажет ffmpeg, чтобы получить этот файл в качестве входных данных. Вы использовали его "-i", firstPath, "-i", secondPath, в своем вопросе
Позвольте нам продолжить обсуждение в чате.
String cmd [] = new String [] {"-y", "- i", "vid.mp4", "i", "vid2.mp4", "-preset", "ultrafast", "-filter_complex", «[0: v] [0: a] [1: v] [1: a] concat = n = 2: v = 1: a = 1 [v] [a]», «- карта», «[v ] "," - карта "," [а] "," / output.mp4 "};
Используется ffmpeg lib: com.writingminds: FFmpegAndroid: 0.3.2
возможный дубликат этого: stackoverflow.com/a/20358243/2919483, надеюсь, это поможет вам