第一步,解析视频文件
private static String processVideo(String filePath) {
List<String> commend=new java.util.ArrayList<String>();
commend.add("ffmpeg");//可以设置环境变量从而省去这行//d:\ffmpeg\ffmpeg.exe
commend.add("-i");
commend.add(filePath);
try {
ProcessBuilder builder = new ProcessBuilder();
builder.command(commend);
builder.redirectErrorStream(true);
Process p= builder.start();
BufferedReader buf = null; // 保存ffmpeg的输出结果流
String line = null;
buf = new BufferedReader(new InputStreamReader(p.getInputStream()));
StringBuffer sb= new StringBuffer();
while ((line = buf.readLine()) != null) {
sb.append(line);
continue;
}
p.waitFor();//这里线程阻塞,将等待外部转换进程运行成功运行结束后,才往下执行
return sb.toString();
} catch (Exception e) {
System.out.println("ffmpeg解析视频文件【" + filePath +"】失败!");
return null;
}
}
第二步,获取相关metadata,获取视频的旋转角度
private static String getRotate() { String rotate = ""; String result = processVideo(videoPath); System.out.println(result); if(StringUtils.isNotEmpty(result)){ PatternCompiler compiler =new Perl5Compiler(); try { String regexRotate ="rotate\\s*:\\s*(\\w*)\\s*"; Pattern patternRotate = compiler.compile(regexRotate, Perl5Compiler.CASE_INSENSITIVE_MASK); PatternMatcher matcherRotate = new Perl5Matcher(); if(matcherRotate.contains(result, patternRotate)){ MatchResult re = matcherRotate.getMatch(); rotate = re.group(1); System.out.println("rotate:"+rotate); } } catch (MalformedPatternException e) { System.out.println("获取【" + videoPath +"】视频信息失败!"); } System.out.println("获取【" + videoPath +"】视频信息成功!"); }else{ System.out.println("执行成功!但未获取到【" + videoPath +"】视频信息!"); } return rotate; }
第三步,根据rotate角度信息,调用旋转命令
private static boolean rotate90mp4(String rotate) { List<String> commend = new ArrayList<String>(); //ffmpeg -i demo.mp4 -vf "transpose=1" o.mp4 try { Runtime runtime = Runtime.getRuntime(); // String cmd = " ffmpeg -i "+ videoPath + " -vf \"transpose=1\" d:\\out\\vertical.mp4"; StringBuffer buf = new StringBuffer(); buf.append(" ffmpeg "); buf.append(" -i "); buf.append(videoPath); if(!StringUtils.isBlank(rotate)){ buf.append(" -vf "); if(rotate.equals("90")) buf.append(" \"transpose=1\" "); else if(rotate.equals("180")) buf.append(" \"transpose=2,transpose=2\" "); else if(rotate.equals("270")) buf.append(" \"transpose=2\" "); } buf.append(destPath); runtime.exec(buf.toString()); return true; } catch (Exception e) { e.printStackTrace(); return false; } }
相关推荐
ffmpeg命令调用获取视频长度等值 自己写的小项目里面使用的。 提取出播放时间 ===00:02:14.03 开始时间 =====1.999000 bitrate 码率 单位 kb==85 编码格式 ===h264 (High) 视频格式 ===yuv420p 分辨率 ===640x368
ffmpeg进行视频旋转
linux下安装FFmpeg命令,亲测可用,文档里面说明了具体的操作步骤,按上面的操作执行即可安装成功.
速度非常快几秒钟搞定,我们都知道视频旋转需要剪辑软件或者格式转换软件,但是处理起来非常麻烦需要逐个调参数,转换软件也需要重新渲染编码转换速度惨不忍睹,有没有直接旋转视频不用编辑和重新渲染编码的方法呢?...
ffmpeg命令录制windows音视频
是不是还在为ffmpeg单个转换视频而烦恼?那就下载我这个脚本吧,一键批处理转换轻松搞定。
FFMpeg命令大全, 详细描述FFMpeg中所包含的命令使用方法
FFmpeg命令.zip
FFmpeg 命令基础学习文档,个人整理汇总,初学者可以下载使用
FFmpeg解码视频把指定时间的图像帧保存为jpg图片,并且可以执行FFmpeg命令。
FFmpeg For Android (三) 移植main函数到安卓上执行ffmpeg命令 完整源码 执行在安卓上执行ffmpeg命令, 示范了音频剪切和视频格式转换 有了它 你可以做很多有趣的app
window下使用ffmpeg命令资源包,(资源分最小就是1分,本来我不想要资源分的,我有很多了,反正也用不完)
FFmpeg命令大全文档
用ffmpeg实现的视频分割,含测试视频,VS2010下可直接编译运行看到结果,其中涉及PTS、DTS调整 ,对学习ffmpeg很有帮助。
Windows平台,Qt调用FFmpeg.exe进行录屏。支持操作,开始录屏-暂停-结束录屏。
ffmpeg最新版命令手册和相关例程详细说明
通过ffmpeg获取视频文件的视频时间长度信息,可以获取各种保存在本地的视频文件中的视频时长信息...完整的C代码和codeblocks工程,没有使用ffmpeg命令,是调用的ffmpeg API方式实现的,在linux下可直接编译和测试通过。
C# Winfrom使用ffmpeg转换视频格式的demo,5.29更新加入CPU核心利用率,视频压缩率,去除目标格式选择,需要的可自行在源码中添加
C# ffmpeg.autogen的例了很少,这是一个不可多得的C#源码,可用于视频处理。C# ffmpeg.autogen的例了很少,这是一个不可多得的C#源码,可用于视频处理
ffmpeg操作命令大全.pdf 命令基本格式及参数 主要参数 视频参数 音频参数 录制 分解与复用 处理原始数据 滤镜 音视频的裁剪与拼接 视频图片转换