精华内容
下载资源
问答
  • 本人,最新编译完成的ffmpeg.so 3.0,android平台亲测通过,最低支持android sdk 4.2 带有头文件 ARM 编译器编译 带有FFMPEG可执行文件
  • 如果想编译静态ffmpeg可执行文件,编译脚本如下: #!/bin/bash export TMPDIR=/Users/aivensmac/work/project/ffmpeg/armbuild/tmp NDK=/Users/aivensmac/

    基础编译,请参考上一篇文章:

    http://blog.csdn.net/muwesky/article/details/55259945


    如果想编译静态ffmpeg可执行文件,编译脚本如下:

    #!/bin/bash
    export TMPDIR=/Users/aivensmac/work/project/ffmpeg/armbuild/tmp
    NDK=/Users/aivensmac/Library/Android/android-ndk-r13b
    SYSROOT=$NDK/platforms/android-16/arch-arm/
    TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
    CPU=arm
    PREFIX=/Users/aivensmac/work/project/ffmpeg/armbuild/bin
    ADDI_CFLAGS="-marm"
    function build_one
    {
    ./configure \
    --prefix=$PREFIX \
    --pkg-config-flags="--static" \
    --extra-cflags="-I$PREFIX/include -static" \
    --extra-ldflags="-L$PREFIX/lib -static" \
    --disable-shared \
    --enable-static \
    --disable-doc \
    --enable-ffmpeg \
    --disable-ffplay \
    --disable-ffprobe \
    --disable-ffserver \
    --disable-doc \
    --disable-symver \
    --enable-small \
    --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
    --target-os=linux \
    --arch=arm \
    --enable-cross-compile \
    --sysroot=$SYSROOT \
    $ADDITIONAL_CONFIGURE_FLAG
    make clean
    rm build.log
    make -j4 | tee build.log
    make install
    }
    build_one


    编译出来的ffmpeg文件大小为11m左右,这个放在android上运行还是太大,下一篇会提供精简过的ffmpeg编译脚本。

    展开全文
  • 一般用法是编译一份 FFmpeg 静态库或动态库(大小 4M+)用于底层依赖和调用,再编译一份 ffmpeg 可执行程序(大小 4M+),但这样实际上项目中有两份 ffmpeg 核心库,会增加安装包体积。因此优化如下: 编译一份 ...

    项目中有两种情况用到 FFmpeg :

    1. C++ 底层代码调用 FFmpeg 用于音视频解码
    2. Android 上层使用 FFmpeg 命令行工具用于音视频裁剪、分离、加水印等

    一般用法是编译一份 FFmpeg 静态库或动态库(大小 4M+)用于底层依赖和调用,再编译一份 ffmpeg 可执行程序(大小 4M+),但这样实际上项目中有两份 ffmpeg 核心库,会增加安装包体积。因此优化如下:

    1. 编译一份 libffmepg.so (大小 4M+),底层代码依赖和可执行程序共同依赖该动态库;
    2. 将 ffmpeg.c 等代码依赖 libffmepg.so 编译 libffmpeg_tool.so 编译成可执行程序(大小几百K,安装包中 90K)

    这样项目中减少一份 ffmpeg 核心库的大小(4M+),安装包能减小 1.5~1.7M

    libffmpeg_tool.so 调用方式:
    1、通过 adb shell 调用测试:

    # 将 libffmpeg_tool.so 和 libffmpeg.so 放到 /data/local/tmp 目录
    adb push libffmpeg_tool.so /data/local/tmp
    adb push libffmpeg.so /data/local/tmp
    # adb shell 并进入 /data/local/tmp 目录
    adb shell
    cd /data/local/tmp
    # 给 libffmpeg_tool.so 赋予可执行权限
    chmod +x libffmpeg_tool.so
    # 增加链接库路径(因为 libffmpeg_tool.so 执行时需要依赖 libffmpeg.so)
    export LD_LIBRARY_PATH=/data/local/tmp:$LD_LIBRARY_PATH
    ./libffmpeg_tool.so -i /sdcard/Alan/ffmpeg/test.mp4
    

    2、在 Android 项目中执行

    private Process exec(String cmd) throws IOException {
            String filepath = getSoFilePath();
            if (!TextUtils.isEmpty(filepath)) {
                String nativeLibrariesPath = mContext.getApplicationContext().getApplicationInfo().nativeLibraryDir;
                Log.e(TAG ," nativeLibrariesPath = " + nativeLibrariesPath);
    
                ProcessBuilder processBuilder = new ProcessBuilder();
                Map<String, String> envMap = processBuilder.environment();
                envMap.put("LD_LIBRARY_PATH", nativeLibrariesPath);
    
                String _cmd = String.format("%s %s", filepath, cmd);
                Log.d(TAG, "_cmd:" + _cmd);
                String[] commands = { "sh", "-c", _cmd };
                processBuilder.command(commands);
    
                return processBuilder.start();
            }
            return null;
        }
    

    完整测试 Demo 及编译脚本见我的 github

    参考链接1
    参考链接2

    展开全文
  • 一、前置操作 ( 移植 FFMPEG )、 二、FFMPEG 混音命令、 三、Android FFMPEG 混音源代码完整示例、 四、博客源码、





    一、前置操作 ( 移植 FFMPEG )



    参考 【Android FFMPEG 开发】Android 中执行 FFMPEG 指令 博客 ;

    在应用的 build.gradle 构建脚本中导入如下依赖 ;

    dependencies {
    	implementation 'com.writingminds:FFmpegAndroid:0.3.2'
    }
    

    然后按照 【Android FFMPEG 开发】Android 中执行 FFMPEG 指令 二、Android 中执行 FFMPEG 指令 中的流程进行开发 , 将拼接好的 FFMPEG 指令传入 ffmpeg.execute 方法 ;





    二、FFMPEG 混音命令



    FFMPEG 混音命令 :

    ffmpeg -i 输入文件1 -i 输入文件2 -i 输入文件3 -filter_complex amix=inputs=输入文件个数:duration=混音时间对齐策略:dropout_transition=声音渐弱时间 输出文件
    

    -i : 输入文件的完整绝对路径 ;

    amix=inputs=2 : 表示混音文件个数 , 有 2 2 2 个文件进行混音 ;

    duration=longest : 设置混音时间对齐策略 , longest 表示最长的音频文件持续时间 , shortest 表示最短输入的持续时间 , first 表示第一个文件的持续时间 ;

    dropout_transition=2 : 表示输入流结束时 , 音量从满音量到 0 0 0 音量渐弱 2 2 2 秒消失 ;


    Android 中的完整命令 :

    -i /data/user/0/com.example.ffmpeg_mix/files/BeardedGrain.mp3 -i /data/user/0/com.example.ffmpeg_mix/files/RainyDay.mp3 -filter_complex amix=inputs=2:duration=longest:dropout_transition=2 /data/user/0/com.example.ffmpeg_mix/files/Mix.mp3
    

    1 1 1 个输入文件是 /data/user/0/com.example.ffmpeg_mix/files/BeardedGrain.mp3 ;

    2 2 2 个输入文件是 /data/user/0/com.example.ffmpeg_mix/files/RainyDay.mp3 ;

    amix=inputs=2 表示当前有 2 2 2 个输入文件 ;

    duration=longest 表示混音时间是最长输入持续时间 ;

    dropout_transition=2 表示输入流结束时 , 音量从满音量到 0 0 0 音量渐弱 2 2 2 秒消失 ;

    最后混音的输出文件是 /data/user/0/com.example.ffmpeg_mix/files/Mix.mp3 ;


    命令分行注释 :

    -i /data/user/0/com.example.ffmpeg_mix/files/BeardedGrain.mp3 // 输入文件 1
    -i /data/user/0/com.example.ffmpeg_mix/files/RainyDay.mp3 // 输入文件 2
    -filter_complex amix=inputs=2:duration=longest:dropout_transition=2 // 混音参数
    /data/user/0/com.example.ffmpeg_mix/files/Mix.mp3 // 输出文件
    




    三、Android FFMPEG 混音源代码完整示例



    Android FFMPEG 混音源代码完整示例 :

    package com.example.ffmpeg_mix
    
    import android.os.Bundle
    import android.util.Log
    import android.view.View
    import android.widget.TextView
    import androidx.appcompat.app.AppCompatActivity
    import com.github.hiteshsondhi88.libffmpeg.ExecuteBinaryResponseHandler
    import com.github.hiteshsondhi88.libffmpeg.FFmpeg
    import com.github.hiteshsondhi88.libffmpeg.LoadBinaryResponseHandler
    import java.io.File
    
    class MainActivity : AppCompatActivity() {
        val TAG = "MainActivity"
    
        /**
         * 应用内置存储下的 files 目录
         */
        lateinit var mFilePath: String
    
        lateinit var ffmpeg: FFmpeg
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
    
            mFilePath = this.filesDir.toString()
    
            // 初始化 FFMPEG
            ffmpeg = FFmpeg.getInstance(this)
    
            // 加载 FFMPEG 可执行文件
            ffmpeg.loadBinary(LoadBinaryResponseHandler())
        }
    
        /**
         * 拷贝文件
         */
        fun copy(view: View) {
            CommandUtils.copyAssets2File(
                this,
                "BeardedGrain.mp3",
                "${mFilePath}/BeardedGrain.mp3")
    
            CommandUtils.copyAssets2File(
                this,
                "RainyDay.mp3",
                "${mFilePath}/RainyDay.mp3")
    
            showText()
        }
    
        /**
         * 执行混音命令
         */
        fun mix(view: View) {
            var cmd = "-i ${mFilePath}/BeardedGrain.mp3 -i ${mFilePath}/RainyDay.mp3 -filter_complex amix=inputs=2:duration=longest:dropout_transition=2 ${mFilePath}/Mix.mp3"
    
            Log.i(TAG, "执行命令 : $cmd")
    
            var cmdArraay = cmd.split(" ").toTypedArray();
            ffmpeg.execute(cmdArraay, object : ExecuteBinaryResponseHandler(){
                override fun onStart() {
                    super.onStart()
                    Log.i(TAG, "onStart")
                }
    
                override fun onFinish() {
                    super.onFinish()
                    Log.i(TAG, "onStart")
                    showText()
                }
    
                override fun onSuccess(message: String?) {
                    super.onSuccess(message)
                    Log.i(TAG, "onSuccess : $message")
                }
    
                override fun onProgress(message: String?) {
                    super.onProgress(message)
                    Log.i(TAG, "onProgress : $message")
                }
    
                override fun onFailure(message: String?) {
                    super.onFailure(message)
                    Log.i(TAG, "onFailure : $message")
                }
            })
        }
    
        /**
         * 显示内置存储目录
         */
        fun showText(){
            var fileString = ""
            var files = File(mFilePath).listFiles()
            files.forEach {
                fileString += "${it}\n"
            }
            findViewById<TextView>(R.id.text).text = fileString
        }
    
    }
    

    执行结果 : 这是混音正确的输出内容 ;

    执行命令 : -i /data/user/0/com.example.ffmpeg_mix/files/BeardedGrain.mp3 -i /data/user/0/com.example.ffmpeg_mix/files/Rain
    onStart
    onProgress : ffmpeg version n3.0.1 Copyright (c) 2000-2016 the FFmpeg developers
    onProgress :   built with gcc 4.8 (GCC)
    onProgress :   configuration: --target-os=linux --cross-prefix=/home/vagrant/SourceCode/ffmpeg-android/toolchain-andro
    onProgress :   libavutil      55. 17.103 / 55. 17.103
    onProgress :   libavcodec     57. 24.102 / 57. 24.102
    onProgress :   libavformat    57. 25.100 / 57. 25.100
    onProgress :   libavdevice    57.  0.101 / 57.  0.101
    onProgress :   libavfilter     6. 31.100 /  6. 31.100
    onProgress :   libswscale      4.  0.100 /  4.  0.100
    onProgress :   libswresample   2.  0.101 /  2.  0.101
    onProgress :   libpostproc    54.  0.100 / 54.  0.100
    onProgress : [mp3 @ 0xe8230000] Skipping 0 bytes of junk at 51635.
    onProgress : [mjpeg @ 0xe80af400] Changing bps to 8
    onProgress : Input #0, mp3, from '/data/user/0/com.example.ffmpeg_mix/files/BeardedGrain.mp3':
    onProgress :   Metadata:
    onProgress :     encoder         : Lavf57.83.100
    onProgress :     album           : 芒种
    onProgress :     title           : 芒种
    onProgress :     artist          : 步束
    onProgress :     disc            : 01
    onProgress :     track           : 1
    onProgress :   Duration: 00:03:35.48, start: 0.025056, bitrate: 321 kb/s
    onProgress :     Stream #0:0: Audio: mp3, 44100 Hz, stereo, s16p, 320 kb/s
    onProgress :     Metadata:
    onProgress :       encoder         : Lavc57.10
    onProgress :     Stream #0:1: Video: mjpeg, yuvj420p(pc, bt470bg/unknown/unknown), 640x640 [SAR 72:72 DAR 1:1], 90k tb
    onProgress :     Metadata:
    onProgress :       comment         : Media (e.g. label side of CD)
    onProgress : [mp3 @ 0xe8230600] Skipping 0 bytes of junk at 18961.
    onProgress : [mjpeg @ 0xe80b0400] Changing bps to 8
    onProgress : Input #1, mp3, from '/data/user/0/com.example.ffmpeg_mix/files/RainyDay.mp3':
    onProgress :   Metadata:
    onProgress :     encoder         : Lavf57.83.100
    onProgress :   Duration: 00:04:25.85, start: 0.025056, bitrate: 320 kb/s
    onProgress :     Stream #1:0: Audio: mp3, 44100 Hz, stereo, s16p, 320 kb/s
    onProgress :     Metadata:
    onProgress :       encoder         : Lavc57.10
    onProgress :     Stream #1:1: Video: mjpeg, yuvj420p(pc, bt470bg/unknown/unknown), 640x640 [SAR 72:72 DAR 1:1], 90k tb
    onProgress :     Metadata:
    onProgress :       comment         : Media (e.g. label side of CD)
    onProgress : [swscaler @ 0xe7f21000] deprecated pixel format used, make sure you did set range correctly
    onProgress : [swscaler @ 0xe7f21000] No accelerated colorspace conversion found from yuv420p to rgb24.
    onProgress : [mp3 @ 0xe8230c00] Frame rate very high for a muxer not efficiently supporting it.
    onProgress : Please consider specifying a lower framerate, a different muxer or -vsync 2
    onProgress : Output #0, mp3, to '/data/user/0/com.example.ffmpeg_mix/files/Mix.mp3':
    onProgress :   Metadata:
    onProgress :     Stream #0:0: Audio: mp3 (libmp3lame), 44100 Hz, stereo, fltp (default)
    onProgress :     Metadata:
    onProgress :       encoder         : Lavc57.24.102 libmp3lame
    onProgress :     Stream #0:1: Video: png, rgb24, 640x640 [SAR 1:1 DAR 1:1], q=2-31, 200 kb/s, 90k fps, 90k tbn, 90k tb
    onProgress :     Metadata:
    onProgress :       comment         : Media (e.g. label side of CD)
    onProgress :       encoder         : Lavc57.24.102 png
    onProgress : Stream mapping:
    onProgress :   Stream #0:0 (mp3) -> amix:input0 (graph 0)
    onProgress :   Stream #1:0 (mp3) -> amix:input1 (graph 0)
    onProgress :   amix (graph 0) -> Stream #0:0 (libmp3lame)
    onProgress :   Stream #0:1 -> #0:1 (mjpeg (native) -> png (native))
    onProgress : Press [q] to stop, [?] for help
    onProgress : frame=    1 fps=0.0 q=0.0 size=       0kB time=00:00:00.00 bitrate= 870.5kbits/s speed=0.00213x    
    onProgress : frame=    1 fps=0.0 q=0.0 size=       0kB time=00:03:31.41 bitrate=   0.0kbits/s speed=3.25x    
    onProgress : frame=    1 fps=0.0 q=0.0 size=       0kB time=00:03:33.00 bitrate=   0.0kbits/s speed=3.25x    
    onProgress : frame=    1 fps=0.0 q=0.0 size=       0kB time=00:03:34.57 bitrate=   0.0kbits/s speed=3.25x    
    onProgress : Error while filtering: Out of memory
    onProgress : frame=    1 fps=0.0 q=-0.0 Lsize=    3995kB time=00:03:35.45 bitrate= 151.9kbits/s speed=3.25x    
    onProgress : video:628kB audio:3367kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.008727%
    onSuccess : 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
        [mp3 @ 0xe8230000] Skipping 0 bytes of junk at 51635.
        [mjpeg @ 0xe80af400] Changing bps to 8
        Input #0, mp3, from '/data/user/0/com.example.ffmpeg_mix/files/BeardedGrain.mp3':
          Metadata:
          Duration: 00:03:35.48, start: 0.025056, bitrate: 321 kb/s
            Stream #0:0: Audio: mp3, 44100 Hz, stereo, s16p, 320 kb/s
            Metadata:
              encoder         : Lavc57.10
            Stream #0:1: Video: mjpeg, yuvj420p(pc, bt470bg/unknown/unknown), 640x640 [SAR 72:72 DAR 1:1], 90k tbr, 90k tbn, 90k tbc
            Metadata:
              comment         : Media (e.g. label side of CD)
        [mp3 @ 0xe8230600] Skipping 0 bytes of junk at 18961.
        [mjpeg @ 0xe80b0400] Changing bps to 8
        Input #1, mp3, from '/data/user/0/com.example.ffmpeg_mix/files/RainyDay.mp3':
          Metadata:
            encoder         : Lavf57.83.100
    
          Duration: 00:04:25.85, start: 0.025056, bitrate: 320 kb/s
            Stream #1:0: Audio: mp3, 44100 Hz, stereo, s16p, 320 kb/s
            Metadata:
              encoder         : Lavc57.10
            Stream #1:1: Video: mjpeg, yuvj420p(pc, bt470bg/unknown/unknown), 640x640 [SAR 72:72 DAR 1:1], 90k tbr, 90k tbn, 90k tbc
            Metadata:
              comment         : Media (e.g. label side of CD)
        [swscaler @ 0xe7f21000] deprecated pixel format used, make sure you did set range correctly
        [swscaler @ 0xe7f21000] No accelerated colorspace conversion found from yuv420p to rgb24.
        [mp3 @ 0xe8230c00] Frame rate very high for a muxer not efficiently supporting it.
        Please consider specifying a lower framerate, a different muxer or -vsync 2
        Output #0, mp3, to '/data/user/0/com.example.ffmpeg_mix/files/Mix.mp3':
          Metadata:
            Stream #0:0: Audio: mp3 (libmp3lame), 44100 Hz, stereo, fltp (default)
            Metadata:
              encoder         : Lavc57.24.102 libmp3lame
            Stream #0:1: Video: png, rgb24, 640x640 [SAR 1:1 DAR 1:1], q=2-31, 200 kb/s, 90k fps, 90k tbn, 90k tbc
            Metadata:
              comment         : Media (e.g. label side of CD)
              encoder         : Lavc57.24.102 png
        Stream mapping:
          Stream #0:0 (mp3) -> amix:input0 (graph 0)
          Stream #1:0 (mp3) -> amix:input1 (graph 0)
          amix (graph 0) -> Stream #0:0 (libmp3lame)
          Str
    2021-06-03 20:16:57.824 30155-30155/com.example.ffmpeg_mix I/MainActivity: onStart
    

    文件内容 : ffmpeg 是可执行文件 , Mix.mp3 是由其余两个 mp3 文件混音而来的 ;

    在这里插入图片描述





    四、博客源码



    博客源码 :

    展开全文
  • 一、推荐开源项目、 二、Android执行 FFMPEG 指令、 1、导入依赖、 2、Java 代码编写、 3、使用时的代码示例、 三、博客资源、





    一、推荐开源项目



    最近需要在 Android 中进行音视频数据转码 , 音频混音 , 音频编辑边裁 等操作 , 如果能在 Android 系统中执行 FFMPEG 指令 , 基本就可以晚上需求 ;


    推荐一个 GitHub 上的项目 : https://github.com/WritingMinds/ffmpeg-android-java


    该项目中 FFmpegAndroid 是 Android Library 核心依赖库 , 在自己的项目中 , 引入该依赖库即可进行 FFMPEG 命令执行 ;

    app Module 仅仅是一个示例项目 , 展示 FFmpegAndroid 依赖库如何使用 ;

    在 FFmpegAndroid 项目中的 ffmpeg-android-java-0.3.2\FFmpegAndroid\assets\armeabi-v7a\ffmpeg 是 FFMPEG 可执行文件 , 可以在 ARM 架构的 Android 系统中执行 ;

    ffmpeg-android-java-0.3.2\FFmpegAndroid\assets\x86\ffmpeg 是可以在 x86 架构的 Android 系统中可执行的文件 ;

    这个 ffmpeg 可执行文件是该应用的核心 ;

    在这里插入图片描述


    基于最后一个可运行版本进行调试 ,

    这个项目在 2016 2016 2016 年停止维护了 , 运行后一堆报错 , 引用了远古版本的 ButterKnife 和 Dagger 依赖库 , 更新了最新的 com.github.dcendents:android-maven-gradle-plugin 插件 , 然后添加了 google() 库支持 , 项目运行起来了 ;

    参考 :

    在这里插入图片描述

    运行该项目 , 执行

    -version
    

    命令 , 打印出该 FFMPEG 的版本 , 3.0.1 的版本 , 有点老 ;

    在这里插入图片描述





    二、Android 中执行 FFMPEG 指令



    参考 http://writingminds.github.io/ffmpeg-android-java/ 博客中的使用介绍 ;



    1、导入依赖


    直接引用项目 :

    repositories {
        flatDir {
            dirs 'libs'
        }
    }
    
    dependencies {
        compile(name:'FFmpegAndroid', ext:'aar')
    }
    

    添加 Gradle 依赖库 :

    compile 'com.writingminds:FFmpegAndroid:0.3.2'
    

    Maven 依赖库 :

    <dependency>
      <groupId>com.writingminds</groupId>
      <artifactId>FFmpegAndroid</artifactId>
      <version>0.3.2</version>
    </dependency>
    


    2、Java 代码编写


    首先 , 初始化 FFMPEG 实例 ;

    FFmpeg ffmpeg = FFmpeg.getInstance(context);
    

    然后 , 加载 ffmpeg 可执行文件 , 该操作是将可执行文件从 assets 目录中拷贝到 Android 应用的内置存储空间 ;

    try {
      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
    }
    

    最后 , 执行 FFMPEG 命令 ;

    try {
      // to execute "ffmpeg -version" command you just need to pass "-version"
      ffmpeg.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() {}
      });
    } catch (FFmpegCommandAlreadyRunningException e) {
      // Handle if FFmpeg is already running
    }
    


    3、使用时的代码示例


    ffmpeg-android-java 项目中 app 的主界面代码 , 有上述 3 3 3 个完整的使用步骤 ;

    package com.github.hiteshsondhi88.sampleffmpeg;
    
    import android.app.Activity;
    import android.app.AlertDialog;
    import android.app.ProgressDialog;
    import android.content.DialogInterface;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.LinearLayout;
    import android.widget.TextView;
    import android.widget.Toast;
    
    import com.github.hiteshsondhi88.libffmpeg.ExecuteBinaryResponseHandler;
    import com.github.hiteshsondhi88.libffmpeg.FFmpeg;
    import com.github.hiteshsondhi88.libffmpeg.LoadBinaryResponseHandler;
    import com.github.hiteshsondhi88.libffmpeg.exceptions.FFmpegCommandAlreadyRunningException;
    import com.github.hiteshsondhi88.libffmpeg.exceptions.FFmpegNotSupportedException;
    
    public class Home extends Activity implements View.OnClickListener {
    
        private static final String TAG = Home.class.getSimpleName();
    
        FFmpeg ffmpeg;
    
        EditText commandEditText;
    
        LinearLayout outputLayout;
    
        Button runButton;
    
        private ProgressDialog progressDialog;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_home);
    
            // 1. 获取 FFMPEG 实例
            ffmpeg = FFmpeg.getInstance(this);
    
            commandEditText = (EditText) findViewById(R.id.command);
            outputLayout = (LinearLayout) findViewById(R.id.command_output);
            runButton = (Button) findViewById(R.id.run_command);
    
            loadFFMpegBinary();
    
            initUI();
        }
    
        private void initUI() {
            runButton.setOnClickListener(this);
    
            progressDialog = new ProgressDialog(this);
            progressDialog.setTitle(null);
        }
    
        // 2. 加载 ffmpeg 可执行文件
        private void loadFFMpegBinary() {
            try {
                ffmpeg.loadBinary(new LoadBinaryResponseHandler() {
                    @Override
                    public void onFailure() {
                        showUnsupportedExceptionDialog();
                    }
                });
            } catch (FFmpegNotSupportedException e) {
                showUnsupportedExceptionDialog();
            }
        }
    
        // 3. 执行命令
        private void execFFmpegBinary(final String[] command) {
            try {
                ffmpeg.execute(command, new ExecuteBinaryResponseHandler() {
                    @Override
                    public void onFailure(String s) {
                        addTextViewToLayout("FAILED with output : "+s);
                    }
    
                    @Override
                    public void onSuccess(String s) {
                        addTextViewToLayout("SUCCESS with output : "+s);
                    }
    
                    @Override
                    public void onProgress(String s) {
                        Log.d(TAG, "Started command : ffmpeg "+command);
                        addTextViewToLayout("progress : "+s);
                        progressDialog.setMessage("Processing\n"+s);
                    }
    
                    @Override
                    public void onStart() {
                        outputLayout.removeAllViews();
    
                        Log.d(TAG, "Started command : ffmpeg " + command);
                        progressDialog.setMessage("Processing...");
                        progressDialog.show();
                    }
    
                    @Override
                    public void onFinish() {
                        Log.d(TAG, "Finished command : ffmpeg "+command);
                        progressDialog.dismiss();
                    }
                });
            } catch (FFmpegCommandAlreadyRunningException e) {
                // do nothing for now
            }
        }
    
        private void addTextViewToLayout(String text) {
            TextView textView = new TextView(Home.this);
            textView.setText(text);
            outputLayout.addView(textView);
        }
    
        private void showUnsupportedExceptionDialog() {
            new AlertDialog.Builder(Home.this)
                    .setIcon(android.R.drawable.ic_dialog_alert)
                    .setTitle(getString(R.string.device_not_supported))
                    .setMessage(getString(R.string.device_not_supported_message))
                    .setCancelable(false)
                    .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            Home.this.finish();
                        }
                    })
                    .create()
                    .show();
    
        }
    
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.run_command:
                    String cmd = commandEditText.getText().toString();
                    String[] command = cmd.split(" ");
                    if (command.length != 0) {
                        execFFmpegBinary(command);
                    } else {
                        Toast.makeText(Home.this, getString(R.string.empty_command_toast), Toast.LENGTH_LONG).show();
                    }
                    break;
            }
        }
    }
    
    




    三、博客资源



    调试通过的源码下载地址 : https://download.csdn.net/download/han1202012/19156661

    资源内容 : 源码 , FFMPEG 中文文档 ;

    在这里插入图片描述

    展开全文
  • android FFmpeg

    2013-05-31 17:23:29
    通过ndk编译ffmpeg源码得到可执行文件,并在android手机上测试成功。
  • 编译Android可执行命令的FFmpeg

    万次阅读 热门讨论 2017-06-07 22:36:22
    本人环境与工具: ...本文是经过实战总结出的经验,本文将用两种方式编译可以在Android执行命令的FFmpeg,一种是传统的ndk-build工具,一种是cmake工具,经过我的项目实战,非常推荐cmake,因为AS
  • linux中使用NDK编译ffmpeg,使其生成可在android平台上运行的可执行文件
  • 是一个Java库,简化您在我使用编译的Android项目中使用ffmpeg的任务 这是该库的两种基本方法: loadBinary(FFmpegLoadBinaryResponseHandler ffmpegLoadBinaryResponseHandler) throws ...
  • Android-ffmpeg编译so文件

    2018-11-01 15:41:35
    踏入ffmpeg的第一步自然就是通过编译得到Android中可以用的so文件 环境准备 centerOS7虚拟机,提供下载centerOS7的镜像文件 百度云迅雷种子地址 jdk环境,参考centerOS7: 搭建java环境 android ndk 环境 ,本文...
  • 没有这些前辈们,估计现在我还在ffmpeg的坑里面打转。。 首先要感谢这位前辈的博文:https://www.cnblogs.com/tplusy/p/11012149.html。本文的思路就是源自于Ta。虽然Ta是在Windows上进行处理的,但是却给我了启发...
  • 一、前置操作 ( 移植 FFMPEG )、 二、FFMPEG 将 PCM 采样转为 MP3 格式的命令、 三、Android FFMPEG 混音源代码完整示例、 四、博客源码、
  • 上一篇讲到了使用FFmpeg生成视频封面图,其实也可以直接使用...然后如何执行命令行工具的博客,但是其实这只是个Demo而已,因为有很多细节需要处理,推荐直接使用开源库。导入源码从FFmpeg源码中导入cmdutils.c、c...
  • 而音视频就离不开开源FFmpeg,之前一直有写博客,一年的沉淀,还是要把博客继续下去,也算是一个总结。 要想学习FFmpeg,首先要学会编译FFmpeg,其实很多不是从事音视频的人,很可能没有继续研究,就是倒在第一...
  • 在以命令方式调用 FFmpeg 的时候,可能会执行一些比较耗时的任务,这时如果没有进度展示,用户可能会以为程序崩溃了,体验十分...谷歌关键词 “Android FFmpeg 命令” 可以得到很多教程,但加上关键词 “进度”就没...
  • Android FFmpeg移植

    2019-09-16 04:42:29
    [TOC] FFmpegSameple介绍 编译FFmpeg 选择参考项目 参考FFmpeg CompilationGuide,上面有FFmpeg在各平台的编译...这里我们需要在Android上进行移植,选择Android。可以看到有以下5个参考项目: https://github.co...
  • Android FFMpeg(一)——编译FFmpeg

    千次阅读 2016-12-05 23:04:24
    学习FFMpeg,推荐雷神的博客。天妒英才,为雷神叹息。第一步 下载FFmpeg(F F m peg)。 第二步 解压FFmpeg。 第三步 windows安装MinGW和Msys。也许还要yasm,名字改为yasm.exe放到C:\WINDOWS\system32中。Linux下...
  • android 执行ffmpeg命令

    2017-10-20 17:45:28
    想在android执行ffmpeg命令,就开始研究,结果中间公司给任务帮web端搞tensorflow,所以东一下西一下,不过差不多同时完成,也算不错 网上资料很多,可是我按他们的来总是一堆错误,不过都跨过去了 想在android上...
  • ffmpeg-android

    2015-03-10 15:23:03
    这个是我移植完成的ffmpeg可执行文件,push到Android目录下可使用。
  • ffmpeg6.2.2-库、头文件、可执行程序 for android.把库文件放在system/lib目录下后,可以直接执行可执行程序。库也可以供开发者使用。
  • 本文将带你了解Android应用开发Android 集成 FFmpeg (三) 获取 FFmpeg 执行进度,希望本文对大家学Android有所帮助。Android 集成 FFmpeg (三) 获取 FFmpeg 执行进度,在以命令方式调用 FFmpeg 的时候,可能会执行...
  • Android 集成 FFmpeg (三) 获取 FFmpeg 执行进度,在以命令方式调用 FFmpeg 的时候,可能会执行一些比较耗时的任务,这时如果没有进度展示,用户可能会以为程序崩溃了,体验十分不好.能不能在以命令方式调用 FFmpeg...
  • Android FFmpeg的编译

    2019-09-05 14:34:56
    ffmepg版本是ffmpeg-3.3.2 这两个版本最好去官网下载,主要是区别Windows和Mac的.期间还试过其他版本的搭配,但是都不行,这两个版本成功了,不知道啥原因. 2、配置NDK 由于操作系统的不同,请自行百度环境配置的方法....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,576
精华内容 1,830
热门标签
关键字:

androidffmpeg可执行文件