[英]FFMPEG output file does not contain any stream [Android] video concat
I have been trying to merge (concatenate) two mp4 videos with same height and width but some error occurs. 我一直试图合并(连接)两个相同高度和宽度的mp4视频但发生了一些错误。 It says the output file doesnot have any stream.
它说输出文件没有任何流。 Please help.
请帮忙。 The code is written below :
代码如下:
String[] arg = new String[]{
ActualVideoFile.getAbsolutePath(), path
};
String list = generateList(arg);
String[] command = new String[]{
" -f concat -i " + list + " -c:v copy " + mergedVideo.getAbsolutePath()
};
try {
ffmpeg.execute(command, new FFmpegExecuteResponseHandler() {
@Override
public void onSuccess(String message) {
Log.e("SUCCESS", message);
}
@Override
public void onProgress(String message) {
Log.e("onProgress", message);
}
@Override
public void onFailure(String message) {
Log.e("onFailure", message);
}
@Override
public void onStart() {
Log.e("onStart", "start");
}
@Override
public void onFinish() {
Log.e("FINISH", "FINISHED");
}
});
} catch (FFmpegCommandAlreadyRunningException e) {
e.printStackTrace();
}
Logcat: logcat的:
E/onFailure: ffmpeg version n3.0.1 Copyright (c) 2000-2016 the FFmpeg developers
built with gcc 4.8 (GCC)
configuration: --target-os=linux --cross-prefix=/home/vagrant/SourceCode/ffmpeg-android/toolchain-android/bin/arm-linux-androideabi- --arch=arm --cpu=cortex-a8 --enable-runtime-cpudetect --sysroot=/home/vagrant/SourceCode/ffmpeg-android/toolchain-android/sysroot --enable-pic --enable-libx264 --enable-libass --enable-libfreetype --enable-libfribidi --enable-libmp3lame --enable-fontconfig --enable-pthreads --disable-debug --disable-ffserver --enable-version3 --enable-hardcoded-tables --disable-ffplay --disable-ffprobe --enable-gpl --enable-yasm --disable-doc --disable-shared --enable-static --pkg-config=/home/vagrant/SourceCode/ffmpeg-android/ffmpeg-pkg-config --prefix=/home/vagrant/SourceCode/ffmpeg-android/build/armeabi-v7a --extra-cflags='-I/home/vagrant/SourceCode/ffmpeg-android/toolchain-android/include -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fno-strict-overflow -fstack-protector-all' --extra-ldflags='-L/home/vagrant/SourceCode/ffmpeg-android/toolchain-android/lib -Wl,-z,relro -Wl,-z,now -pie' --extra-libs='-lpng -lexpat -lm' --extra-cxxflags=
libavutil 55. 17.103 / 55. 17.103
libavcodec 57. 24.102 / 57. 24.102
libavformat 57. 25.100 / 57. 25.100
libavdevice 57. 0.101 / 57. 0.101
libavfilter 6. 31.100 / 6. 31.100
libswscale 4. 0.100 / 4. 0.100
libswresample 2. 0.101 / 2. 0.101
libpostproc 54. 0.100 / 54. 0.100
Output #0, mp4, to ' -f concat -i /data/data/com.myapp/cache/ffmpeg-list-768575373.txt -c:v copy /storage/emulated/0/myapp/MergedVideos/1465426928071_Video.mp4':
Output file #0 does not contain any stream
Any help would be appreciated Thanks 任何帮助将不胜感激谢谢
This is my complete code snippet.. I am adding image overlay to video. 这是我的完整代码片段。我正在为视频添加图片叠加层。 For testing I have kept video and image in assets folder
为了测试,我将视频和图像保存在assets文件夹中
File myDirectory = new File(Environment.getExternalStorageDirectory() + "/EditedVideo_2/");
File outputDirectory = new File(Environment.getExternalStorageDirectory() + "/EditedVideo_2/video" + System.currentTimeMillis() + ".mp4");
Log.d("directory path",Environment.getExternalStorageDirectory() + "/EditedVideo_2/");
if (!myDirectory.exists())
{
myDirectory.mkdirs();
}
File f = new File(Environment.getExternalStorageDirectory() + "/EditedVideo_2/sample.mp4");
if (!f.exists()) try
{
InputStream is = getAssets().open("sample.mp4");
int size = is.available();
byte[] buffer = new byte[size];
is.read(buffer);
is.close();
FileOutputStream fos = new FileOutputStream(f);
fos.write(buffer);
fos.close();
}
catch (Exception e)
{
throw new RuntimeException(e);
}
Log.d("Path = ",f.getPath());
File imageFile = new File(Environment.getExternalStorageDirectory() + "/EditedVideo_2/ic_launcher.png");
if (!imageFile.exists()) try
{
InputStream is = getAssets().open("ic_launcher.png");
int size = is.available();
byte[] buffer = new byte[size];
is.read(buffer);
is.close();
FileOutputStream fos = new FileOutputStream(imageFile);
fos.write(buffer);
fos.close();
}
catch (Exception e)
{
throw new RuntimeException(e);
}
FFmpeg ffmpeg = FFmpeg.getInstance(this);
try {
ffmpeg.loadBinary(new LoadBinaryResponseHandler()
{
@Override
public void onStart()
{
Log.d("Event ","onStart");
}
@Override
public void onFailure()
{
Log.d("Event ","onFailure");
}
@Override
public void onSuccess()
{
Log.d("Event ","onSuccess");
}
@Override
public void onFinish()
{
Log.d("Event ","onFinish");
}
});
} catch (FFmpegNotSupportedException e) {
// Handle if FFmpeg is not supported by device
}
try {
// to execute "ffmpeg -version" command you just need to pass "-version"
//String[] cmd = {"-version"};
String[] cmd = {"-i",""+f.getPath(),"-i",""+imageFile.getPath(),"-filter_complex","overlay=10:main_h-overlay_h-10",outputDirectory.getPath()};
ffmpeg.execute(cmd, new ExecuteBinaryResponseHandler()
{
@Override
public void onStart()
{
Log.d("Event ","onStart");
}
@Override
public void onProgress(String message)
{
Log.d("Event ","onProgress - "+message);
}
@Override
public void onFailure(String message)
{
Log.d("Event ","onFailure - "+message);
}
@Override
public void onSuccess(String message)
{
Log.d("Event ","onSuccess - "+message);
}
@Override
public void onFinish()
{
Log.d("Event ","onFinish");
}
});
} catch (FFmpegCommandAlreadyRunningException e) {
// Handle if FFmpeg is already running
}
Had the same issue. 有同样的问题。 Turns out it's how the command is built.
原来它是命令的构建方式。
This is incorrect as you need to divide up each command: 这是不正确的,因为您需要分割每个命令:
String[] command = new String[]{" -f concat -i " + list + " -c:v copy " + mergedVideo.getAbsolutePath();
Chirag your answer is spot on: Chirag您的回答是:
String[] cmd = {"-i",""+f.getPath(),"-i",""+imageFile.getPath(),"-filter_complex","overlay=10:main_h-overlay_h-10",outputDirectory.getPath()};
Hope this helps. 希望这可以帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.