当前位置: 首页 > 知识库问答 >
问题:

FFmpegAndroid执行

步浩壤
2023-03-14

在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

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

共有3个答案

赏育
2023-03-14

朋友们,请注意,如果您的sdk版本等于或高于23(Marshmelow),请不要忘记检查其运行时权限

Android准许写入外部存储器

这是我的问题。一切都很好,但是日志没有显示成功的结果。

曹成双
2023-03-14

好啊您的问题是没有加载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/

汤枫涟
2023-03-14

好的,我找到了答案:使用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());
        }
}
 类似资料:
  • Ruby 程序 Ruby程序的执行就是对代码进行计算的过程。先编译程序文本,遇到BEGIN就对其作出计算;然后计算顶层的一系列的表达式;若遇到END的话,将在最后对其进行处理然后结束程序(关于结束程序时处理步骤的详细过程请参考结束程序时的相关处理)。 语句 if if句的计算过程如下:先对条件表达式进行计算,若为真则执行相应代码段,若为假则依次计算elseif部分的条件表达式,若遇到值为真的表达式

  • 问题内容: 我已经尝试了这两个代码,但是却没有执行,有人可以告诉我为什么吗? 提前致谢 问题答案: 试试这个代码: 它会在源元素的位置单击并按住,移至目标元素的位置,然后释放鼠标。 要么 它将单击并按住源元素的位置,移动给定的偏移量,然后释放鼠标。 要么 它将执行以上两个代码的操作。 我在Java上编写此代码。您可以转换为指定的语言。 从动作引用。

  • 我正在构建一个能够执行Selenium指令和Cucumber指令的框架。我已经在一个单独的空类中为Cucumber创建了runner,代码如下 我还将在一个单独的类中为Selenium指令提供一个处理器。 如果Cucumber运行类是空类,我如何执行它?,我是否只是为Cucumber创建运行类的实例?还是我得去做些别的

  • 电磁铁模块 快门线模块

  • 既然已经学了execute和normal!,我们就可以深入探讨一个Vimscript惯用法。 执行下面的命令: :::vim :execute "normal! gg/foo\<cr>dd" 这将移动到文件的开头,查找foo的首次出现的地方,并删掉那一行。 之前我们尝试过用normal!来执行一个搜索命令却无法输入必须的回车来开始进行搜索。 结合execute和normal!将解决这个问题。 e

  • 问题内容: 我有一个http服务器(使用启动),我想做一些操作。 我该怎么做(在Linux上)?在ctrl-C的情况下可以进行那些操作吗? 我不熟悉Unix信号,因此答案可能很简单。 问题答案: 您可以使用信号包订购TERM和INT信号。但是请注意,只有在明确终止进程时才发送这些信号。正常退出(由流程本身启动)不涉及任何信号。我认为,对于正常退出,只需在主例程中执行某些操作即可(该例程应该生成工作