FFmpeg(五)实现视频编辑
2023-03-07 本文已影响0人
默默_大魔王
前面已经介绍了视频的格式,这篇文章我们去编辑一下视频
简单介绍和我们要使用的工具
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);