如何使用监护人项目在android中使用FFMPEG连接视频

时间:2014-06-11 12:23:56

标签: java android video ffmpeg

我正在尝试使用监护人项目将两个mp4视频合并为我的应用中的库项目。但它不会在指定位置生成输出。我为它做了各种解决方案,但没有成功。 PFB代码:

File fileTmp = this.getCacheDir(); 
File fileAppRoot = new File(this.getApplicationInfo().dataDir);

FfmpegController fc;

fc = new FfmpegController(fileTmp, fileAppRoot);



    final Clip out = new Clip(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)+"/Video/compiled.mp4");

    ArrayList<Clip> listVideos = new ArrayList<Clip>();

    File fileVideoRoot = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)+"/Video");
    String[] fileList = fileVideoRoot.list();

    for (String fileVideo : fileList)
    {
        if (fileVideo.endsWith("mp4"))
        {
            Clip clip = new Clip();
            clip.path = new File(fileVideoRoot,fileVideo).getCanonicalPath();

            fc.getInfo(clip);

            clip.duration = clip.duration-1;
            listVideos.add(clip);


        }
    }


    fc.concatAndTrimFilesMP4Stream(listVideos, out, false, false, new ShellUtils.ShellCallback() {

        @Override
        public void shellOut(String shellLine) {

            System.out.println("fc>" + shellLine);
        }

        @Override
        public void processComplete(int exitValue) {

            if (exitValue < 0)
                System.err.println("concat non-zero exit: " + exitValue);

        }
    });

我得到例外:

  

渲染视频时出现问题:   /mnt/sdcard/Download/Video/compiled.mp4

请指导我如何在android中连接视频。

1 个答案:

答案 0 :(得分:0)

这不是来自ffmpeg的stdout的ffmpeg错误。

为了弄清楚实际发生了什么,你需要在android层中捕获STREAM = stdout和来自本地&#39;流程构建者的STREAM = stderr&#39;或者你用来从Android / java获得shell的任何东西......

例如:

            ProcessBuilder builder = new ProcessBuilder(command);
            Map<String, String> environ = builder.environment();
//          for(Entry<String, String> entry : environ.entrySet()){
    //          System.out.println("ENV " +entry.getKey() + " " +entry.getValue());
      //      }
//          builder.redirectErrorStream(true);
            Process process = null;
            try {
                process = builder.start();

            InputStream is = process.getInputStream();

            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);
            String line;
            while ((line = br.readLine()) != null) {  
              //System.out.println(line);
                outfil=line;
            }

//          int exitVal = process.waitFor();
 //           System.out.println("Process exitValue: " + exitVal);

如果您使用root电话进行测试,那么您应该只能使用adb push将ffmpeg二进制文件移动到/ data / data / ...并直接调用它。

您可以将stderr / stdout与CLI测试一起重定向到日志文件。