FFmpeg实现视频编辑

114 阅读2分钟

前言

简单介绍和我们要使用的工具
ffmpeg:包含FFmpeg的各种功能,如:gif、格式转换、截图、编解码等
ffplay:一个使用了FFmpeg和SDL库的、简单的、可移植的媒体播放器
ffprobe:用来查看多媒体文件的信息
ffserver:与流媒体服务器有关,负责响应客户端的流媒体请求,把流媒体数据发送给客户端

常用命令:

常用命令表述
-version显示版本
-demuxers显示可用的demuxers
--muxers显示可用的-muxers
-devices显示可用的设备
-codecs显示所有的编解码器
-decoders显示可用的解码器
-encoders显示所有的编码器
-bsfs显示比特流filter
-formats显示可用的格式
-protocols显示可用的协议
-filters显示可用的过滤器
-pix_fmts显示可用的像素格式
-sample_fmts显示可用的采样格式
-layouts显示channel名称
-colors显示识别的颜色名称

如果要播放一个视频 输入以下命令(我电脑已安装ffmpeg,并且有视频文件)

//播放视频          
ffplay D:\ffmpeg\test.mp4    
//剪切视频 
ffmpeg -ss 0:1:30 -t 0:0:20 -i input.avi -vcodec copy -acodec copy output.avi    

我们写一个本地方法,让ffmpeg帮我们剪辑视频

new Thread(new Runnable() {
            @Override
            public void run() {
                //ss 开始时间  tt 结束时间
                String cmd = "ffmpeg -ss 0:1:30 -t 0:0:20 -i input.avi -vcodec copy -acodec copy output.avi ";
                //把命令交给native层处理,native 调用ffmpeg SDK
                run(cmd.split("[ \\t]+"));
            }
        }).start();

public native int run(String[] cmd);



直接看native方法

#include <jni.h>
#include "ffmpeg.h"

JNIEXPORT jint

JNICALL
Java_com_tj_myapplication_MainActivity_run(
        JNIEnv *env, jclass obj, jobjectArray commands) {
    int argc = (*env)->GetArrayLength(env, commands);
    char *argv[argc];

    int i;
    for (i = 0; i < argc; i++) {
        jstring js = (jstring) (*env)->GetObjectArrayElement(env, commands, i);
        argv[i] = (char *) (*env)->GetStringUTFChars(env, js, 0);
    }
    return runCmd(argc, argv);
}

修改ffmpeg.c里面的方法

int runCmd(int argc, char **argv)
{
    略...最后添加下面代码,恢复状态
    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;

    return main_return_code;
}
//ffmpeg.h文件里面添加
int runCmd(int argc, char **argv)

👀关注公众号:Android老皮!!!欢迎大家来找我探讨交流👀