android 执行ffmpeg命令

最近边搞tensorflow边搞ffmpeg,心好累
想在android上执行ffmpeg命令,就开始研究,结果中间公司给任务帮web端搞tensorflow,所以东一下西一下,不过差不多同时完成,也算不错
网上资料很多,可是我按他们的来总是一堆错误,不过都跨过去了
想在android上执行ffmpeg命令需要一个已经编译过的ffmpeg源码,编译网上资料很多,想了想有空还是写一篇关于编译的博客吧
先做好备份
复制ffmpeg.h,ffmpeg.c,cmdutils.h,cmdutils.c,ffmpeg_filter.c,ffmpeg_opt.c到项目的cpp文件夹
然后在 源码内删除这些文件,没错就是删除这些文件,不然会报错,这个错误我搞了很久,网上都是复制没有删除,可我就是报错,删了就OK
修改ffmpeg.c与ffmpeg.h
把ffmpeg.c的int main(int argc, char argv) 改名为 int run(int argc, char argv)
在ffmpeg.h内添加
int run(int argc, char **argv);
在run函数内的return前添加
nb_filtergraphs = 0;
progress_avio = NULL;

input_streams = NULL;
nb_input_streams = 0;
input_files = NULL;
nb_input_files = 0;

output_streams = NULL;
nb_output_streams = 0;
output_files = NULL;
nb_output_files = 0;

修改cmdutils.c 和 cmdutils.h
找到cmdutils.c中的exit_program函数,把exit_program函数改成
int exit_program(int ret)
{
    if (program_exit)
        program_exit(ret);

    return ret;
}
再在cmdutils.h修改
int exit_program(int ret) av_noreturn;
改成
int exit_program(int ret);
改好后开始写代码
在CMakeLists.txt代码
add_library( ffmpeg_run
             SHARED
             src/main/cpp/ffmpeg_run.cpp
             src/main/cpp/ffmpeg.c
             src/main/cpp/cmdutils.c
             src/main/cpp/ffmpeg_filter.c
             src/main/cpp/ffmpeg_opt.c)

find_library( log-lib
              log )

set(distribution_DIR ../../../../libs)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")
set(CMAKE_VERBOSE_MAKEFILE on)
include_directories(C:/f/ffmpeg-3.3.2)

add_library( avcodec-57
             SHARED
             IMPORTED)
add_library( avdevice-57
             SHARED
             IMPORTED)
add_library( avfilter-6
             SHARED
             IMPORTED)
add_library( avformat-57
             SHARED
             IMPORTED)
add_library( avutil-55
             SHARED
             IMPORTED)
add_library( swresample-2
             SHARED
             IMPORTED)
add_library( swscale-4
             SHARED
             IMPORTED)
set_target_properties( avcodec-57
                       PROPERTIES IMPORTED_LOCATION
                       ${distribution_DIR}/${ANDROID_ABI}/libavcodec-57.so)
set_target_properties( avdevice-57
                       PROPERTIES IMPORTED_LOCATION
                       ${distribution_DIR}/${ANDROID_ABI}/libavdevice-57.so)
set_target_properties( avfilter-6
                       PROPERTIES IMPORTED_LOCATION
                       ${distribution_DIR}/${ANDROID_ABI}/libavfilter-6.so)
set_target_properties( avformat-57
                       PROPERTIES IMPORTED_LOCATION
                       ${distribution_DIR}/${ANDROID_ABI}/libavformat-57.so)
set_target_properties( avutil-55
                       PROPERTIES IMPORTED_LOCATION
                       ${distribution_DIR}/${ANDROID_ABI}/libavutil-55.so)
set_target_properties( swresample-2
                       PROPERTIES IMPORTED_LOCATION
                       ${distribution_DIR}/${ANDROID_ABI}/libswresample-2.so)
set_target_properties( swscale-4
                       PROPERTIES IMPORTED_LOCATION
                       ${distribution_DIR}/${ANDROID_ABI}/libswscale-4.so)



target_link_libraries(  ffmpeg_run

                        avcodec-57
                        avdevice-57
                       avfilter-6
                       avformat-57
                       avutil-55
                       swresample-2
                       swscale-4
                       
                       ${log-lib}
                       android)
include_directories自己的ffmpeg源码路径
java代码FfmpegCmd.java
public class FfmpegCmd {
    static {
        System.loadLibrary("ffmpeg_run");
    }
    public static native int ffmpegRun(String[] cmd);
}
c++代码
extern "C"
JNIEXPORT jint JNICALL
Java_com_ffmpeg_run_FfmpegCmd_ffmpegRun(JNIEnv *env, jobject instance, jobjectArray cmd) {

    // TODO
    int argc = env->GetArrayLength(cmd);
    char *argv[argc];
    int i;
    for (i = 0; i < argc; i++) {
        jstring js = (jstring) env->GetObjectArrayElement(cmd, i);
        argv[i] = (char *) env->GetStringUTFChars(js, 0);
    }
    return run(argc,argv);
}
执行代码
Thread thread = new Thread(){
    @Override
    public void run() {
        super.run();
        String base = "/storage/emulated/0/360";

        String[] commands = new String[16];
        commands[0] = "ffmpeg";
        commands[1] = "-i";
        commands[2] = base + "/test10086.mp4";
        commands[3] = "-r";
        commands[4] = "5";
        commands[5] = "-q:v";
        commands[6] = "2";
        commands[7] = "-s";
        commands[8] = "1280x720";
        commands[9] = "-ss";
        commands[10] = "0:0:0";
        commands[11] = "-t";
        commands[12] = "0:0:15";
        commands[13] = "-f";
        commands[14] = "image2";
        commands[15] = base + "/merge%d.png";
        FfmpegCmd.ffmpegRun(commands);
    }
};
thread.start();
完成,中间还碰到其他问题,一时想不起来在哪里,就简单说一下
有一个参数名是class,编译会报错,说在()内有错误,坑死了,把这个参数改成avClass
还有个错误是报什么c++11错误
是一个什么64的宏和双引号"太近了,加个空格就OK了










  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用FFmpeg命令可以在Android应用程序中进行音频和视频处理。下面是使用FFmpeg命令的步骤: 1. 在Android项目中添加FFmpeg库。你可以从FFmpeg官网下载编译好的库文件。 2. 将FFmpeg库文件拷贝到你的Android项目中的libs文件夹下。 3. 在AndroidManifest.xml文件中添加如下权限: ```xml <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> ``` 4. 在你的Activity中添加代码,执行FFmpeg命令: ```java String[] cmd = {"ffmpeg", "-i", inputFilePath, "-c:v", "copy", "-c:a", "aac", "-b:a", "256k", outputFilePath}; FFmpeg.getInstance(context).execute(cmd, new ExecuteBinaryResponseHandler() { @Override public void onStart() { // 执行命令开始时的回调 } @Override public void onProgress(String message) { // 执行命令过程中的进度回调 } @Override public void onFailure(String message) { // 执行命令失败时的回调 } @Override public void onSuccess(String message) { // 执行命令成功时的回调 } @Override public void onFinish() { // 执行命令结束时的回调 } }); ``` 上面的代码中,inputFilePath是输入文件的路径,outputFilePath是输出文件的路径。在这个例子中,我们将输入文件的视频流直接复制到输出文件中,同时将输入文件的音频流转换为AAC编码的流。 当你执行FFmpeg命令时,你需要注意以下几点: - 为了避免在主线程中执行耗时的操作,你应该在子线程中执行FFmpeg命令。 - 执行FFmpeg命令可能会消耗大量的内存和CPU资源,因此你需要确保你的设备有足够的资源来执行命令。 - FFmpeg命令的语法和参数非常复杂,你需要仔细阅读FFmpeg官方文档以及其他相关资料,以便正确地使用它。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值