【问题标题】:FFmpeg android executeFFmpeg 安卓执行
【发布时间】:2019-09-18 03:09:48
【问题描述】:

在 Windows 上,我可以使用 ffmpeg.exe 使用以下代码剪切视频

无法在 android 中使用 ffmpeg。 我使用 gradle 在我的应用中抓取 ffmpeg。

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.github.hiteshsondhi88.libffmpeg:FFmpegAndroid:0.2.5'
}

我的方法中有这些行

VideoIn = getInternalDirectoryPath() + "/Download/Ab.mp4";
VideoOut = getInternalDirectoryPath() + "/Download/Ab1.mp4";

try {
ffmpeg.execute("ffmpeg -i " + VideoIn + " -ss 00:00:03 -c:v libx264 -crf 17 -t 00:00:5 " + VideoOut + " -y",null);
}
catch (FFmpegCommandAlreadyRunningException e) { 
e.printStackTrace();
}

显示此错误:运行 exec() 时出错。命令:[/data/data/com.videoeditor.myname.myapp/files/ffmpeg,ffmpeg,-i,/storage/emulated/0/Download/Ab.mp4,-ss,00:00:03,-c: v, libx264, -crf, 17, -t, 00:00:5, /storage/emulated/0/Download/Ab1.mp4, -y] 工作目录:null 环境:null

这种方法有什么问题?感谢您的帮助

【问题讨论】:

    标签: android ffmpeg execute


    【解决方案1】:

    好的,我找到了答案: 使用这种ffmpeg的方法,cmd中不需要“ffmpeg”

    简单的视频剪辑示例:

     /**
     * Returns the path to internal storage ex:- /storage/emulated/0
     *
     * @return
     */
    private String getInternalDirectoryPath() {
        return Environment.getExternalStorageDirectory().getAbsolutePath();
    }
    
    VideoIn = getInternalDirectoryPath() + "/Download/Ab.mp4";
    VideoOut = getInternalDirectoryPath() + "/Download/Ab1.mp4";
    
    private void CutVideo(){
    try {
         ffmpeg.execute("-i "+VideoIn+" -ss 00:01:00 -to 00:02:00 -c copy "+VideoOut ,
    new ExecuteBinaryResponseHandler() {
    
                    @Override
                    public void onStart() {
                    //for logcat
                        Log.w(null,"Cut started");
                    }
    
                    @Override
                    public void onProgress(String message) {
                    //for logcat
                        Log.w(null,message.toString());
                    }
    
                    @Override
                    public void onFailure(String message) {
    
                        Log.w(null,message.toString());
                    }
    
                    @Override
                    public void onSuccess(String message) {
    
                        Log.w(null,message.toString());
                    }
    
                    @Override
                    public void onFinish() {
    
                        Log.w(null,"Cutting video finished");
                    }
                });
            } catch (FFmpegCommandAlreadyRunningException e) {
                // Handle if FFmpeg is already running
                e.printStackTrace();
                Log.w(null,e.toString());
            }
    }
    

    【讨论】:

    • 如果我们想玩,也一样吗?
    【解决方案2】:

    好的。您的问题是您没有加载 ffmpeg 二进制文件。您必须在执行命令之前加载它。试试这样的:

    private FFmpeg ffmpeg;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        FFmpeg ffmpeg = FFmpeg.getInstance(this);
        try {
            //Load the binary
            ffmpeg.loadBinary(new LoadBinaryResponseHandler() {
    
                @Override
                public void onStart() {}
    
                @Override
                public void onFailure() {}
    
                @Override
                public void onSuccess() {}
    
                @Override
                public void onFinish() {}
            });
        } catch (FFmpegNotSupportedException e) {
            // Handle if FFmpeg is not supported by device
        }
        try {
            // to execute "ffmpeg -version" command you just need to pass "-version" 
            // Now, you can execute your command here
            ffmpeg.execute("ffmpeg -version", new ExecuteBinaryResponseHandler() {
    
                @Override
                public void onStart() {}
    
                @Override
                public void onProgress(String message) {}
    
                @Override
                public void onFailure(String message) {}
    
                @Override
                public void onSuccess(String message) {
                    Log.i("SUCCESS", message);
                }
    
                @Override
                public void onFinish() {}
            });
        } catch (FFmpegCommandAlreadyRunningException e) {
            // Handle if FFmpeg is already running
        }
    }
    

    更多信息http://hiteshsondhi88.github.io/ffmpeg-android-java/

    【讨论】:

    • 嘿伙计,谢谢!这真的帮助了我!加载二进制文件后,它不再得到“找不到文件”:)
    • 嘿@jmartinalonso ffmpeg 库是否适用于非 root 的 android 设备。我正在尝试从视频中提取音频,但文件未在 sdcard 中创建,我没有收到任何错误。帮助表示赞赏
    • 我面临同样的问题。命令执行并停留在 D/FFmpeg:运行发布更新方法但未创建文件。你是怎么解决这个问题的?
    【解决方案3】:

    朋友,顺便提一下,如果你的sdk版本等于或高于23(Marshmelow),别忘了检查运行时权限

    android.permission.WRITE_EXTERNAL_STORAGE

    那是我的问题。一切都很好,但日志没有显示 onSuccess 结果。
    android doc 获取运行时权限

    【讨论】:

      【解决方案4】:

      您需要阅读进程的错误流以找出问题所在:

      InputStreamReader errReader = new InputStreamReader(process.getErrorStream());
      BufferedReader bufReader = new BufferedReader(errReader);
      while ((String line = bufReader.readLine()) != null) {
          Log.d("MyApp", line);
      }
      

      但我认为问题在于 exec 方法的参数错误,如果你需要同时运行 chmodffmpeg,你应该使用 exec(String[] progArray, String[] envp)

      【讨论】:

      • 抱歉,我编辑了问题以准确了解 ffmpeg.execute 错误。
      猜你喜欢
      • 2012-09-30
      • 2016-05-29
      • 2012-05-10
      • 2012-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-01
      相关资源
      最近更新 更多