我在需要将多个mp4文件合并为一个应用程序的应用程序中使用https://github.com/hiteshsondhi88/ffmpeg-android-java。
这是一个命令
ffmpeg -i concat:"/data/data/com.testapp.app/cache:temp/lds82df9skov65i15k3ct16cik.mp4|/data/data/com.testapp.app/cache:temp/qm5s0utmb8c1gbhch6us2tnilo.mp4" -codec copy /data/data/com.testapp.app/cache:temp/4egqalludvs03tnfleu5dgb6iv.mp4
附加文件的java方法,电影文件是一个包含我想要组合的文件的数组
public void appendFiles() {
showProgressDialog();
movieFile = getRandomFile();
StringBuilder b = new StringBuilder();
try {
for (int i = 0; i < movieFiles.size(); i++) {
File f = movieFiles.get(i);
if (!f.exists()) {
continue;
}
if(i != 0){
b.append("|");
}
b.append(f.getPath());
}
final String command = "-i concat:\""+b.toString() + "\" -codec copy " + movieFile.getPath();
try {
ffmpeg.execute(command, new ExecuteBinaryResponseHandler() {
@Override
public void onFailure(String s) {
app.log("FAILED with output : " + s);
}
@Override
public void onSuccess(String s) {
app.log("SUCCESS with output : " + s);
createThumbnail();
stopProgressDialog();
startReview();
}
@Override
public void onProgress(String s) {
app.log("Started command : ffmpeg " + command);
}
@Override
public void onStart() {
app.log("Started command : ffmpeg " + command);
}
@Override
public void onFinish() {
app.log("Finished command : ffmpeg " + command);
}
});
}
catch (FFmpegCommandAlreadyRunningException e) {
e.printStackTrace();
}
}
catch (Exception e) {
e.printStackTrace();
}
}
和getRandomFile()
public File getRandomFile() {
if (captureDir != null) {
if (captureDir.exists()) {
SecureRandom random = new SecureRandom();
File file = new File(captureDir, new BigInteger(130, random).toString(32) + ".mp4");
return file;
}
}
return null;
}
但我一直看到错误没有这样的文件或目录
concat:“/ data / data / com.testapp.app / cache:temp / lds82df9skov65i15k3ct16cik.mp4 | /data/data/com.testapp.app/cache:temp /qm5s0utmb8c1gbhch6us2tnilo.mp4”:没有这样的文件或目录
任何想法?
答案 0 :(得分:1)
您可以使用以下命令。 ffmpeg -f concat -i list.txt -c:v copy -c:copy result.mp4
但是如果你将文件的完整路径存储在list.txt文件中,如
file '/sdcard/blabla/v0.mp4'
file '/sdcard/blabla/v1.mp4'
file '/sdcard/blabla/v2.mp4'
然后你需要添加-safe 0 flag。
ffmpeg -f concat -safe 0 -i list.txt -c:v copy -c:a copy result.mp4
您使用的库中的用法如下:
String[] cmd = new String[]{"-f", "concat", "-safe", "0", "-i", "list.txt", "-c", "copy", "-preset", "ultrafast", outFile};
ffmpeg.execute(cmd, new ExecuteBinaryResponseHandler()
{
@Override
public void onFailure(String message)
{
}
@Override
public void onSuccess(String message)
{
}
@Override
public void onProgress(String message)
{
}
@Override
public void onStart()
{
}
@Override
public void onFinish()
{
}
}
答案 1 :(得分:0)
我刚刚完成了这件事。命令
ffmpeg -i "concat:file1.mp4|file2.mp4"
不起作用。您必须将文件列表保存到文本文件中,然后触发:
ffmpeg -f concat -i list.txt -c:v copy -c:a copy result.mp4
尝试一下 - 我使用的是相同的库。
答案 2 :(得分:0)
很晚:但这个概念可能对寻求解决此类问题的人有所帮助 可能的原因可能是两个视频具有不同的采样率和帧速率。因此,您需要先将其转换或转码为相同的速率。之后您可以连接相应的视频。