FFMPEG输出文件不包含任何流[Android]视频concat

问题描述:

我一直在试图合并(连接)两个具有相同高度和宽度的mp4视频,但会发生一些错误。它说输出文件没有任何流。 请帮忙。 的代码写在下面:FFMPEG输出文件不包含任何流[Android]视频concat

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:

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 

任何帮助,将不胜感激 感谢

+0

说不上来保存视频和图像是否会修复,但尝试...'“-y -f CONCAT -i” +列表+“-c:V复制-Map 0” + mergedVideo.getAbsolutePath()' –

+2

看到这个链接https://github.com/WritingMinds/ffmpeg-android-java/issues/88它可能是有帮助的。 –

这是我完整的代码片断..我添加图像叠加到视频。为了测试我在资产文件夹

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 
    } 
+0

你真的救了我一天 –

+0

谢谢哥们,救了我一天 –