通过Java实现视频转码如下两个方案:

1.利用国外一个大佬写的jar包jave,里面集成了ffmpeg,目前源码应该是更新到1.0.2,看了下源码应该发现,这个功能还是非常强大的,如果不需要转码,只需要获取下图片,视频信息,更是方便= = 。

JAVE(Java Audio Video Encoder),是一个包涵ffmpeg项目库。开发这可以运用它去实现音频(Audio)与视频(Video)文件的转码。例如你要把AVI格式文件转为MPEG文件、WAV格式文件转为MP3格式文件,同时你还能调整文件大小与比例。JAVE兼容和支持很多格式之间的转码……

转码的方法:

public void encode(java.io.File source, java.io.File target, it.sauronsoftware.jave.EncodingAttributes attributes) throws java.lang.IllegalArgumentException, it.sauronsoftware.jave.InputFormatException, it.sauronsoftware.jave.EncoderException {File source = new File("source.avi");  File target = new File("target.mp4");  AudioAttributes audio = new AudioAttributes();  audio.setCodec("libmp3lame");  audio.setBitRate(new Integer(56000));  audio.setChannels(new Integer(1));  audio.setSamplingRate(new Integer(22050));  VideoAttributes video = new VideoAttributes();  video.setCodec("libx264");  EncodingAttributes attrs = new EncodingAttributes();  attrs.setFormat("mp4");  //h264编码attrs.setAudioAttributes(audio);  attrs.setVideoAttributes(video);  Encoder encoder = new Encoder();  encoder.encode(source, target, attrs);
}

借鉴的这篇博客:https://blog.csdn.net/qllinhongyu/article/details/29817297  里面介绍jave更详细点

2.利用FFmpeg进行转码,有坏处:

windows服务器还比较简单,直接下载ffmpeg可以直接进行转码了,但是linux服务器的ffmpeg的安装真的挺麻烦的。。我用了3个小时装好。
需要调用java执行外部程序Runtime类或者ProcessBuilder去构建Process,据说调用多了,非常损耗性能。

Runtime runtime = Runtime.getRuntime();
Process p = runtime.exec(cmd);
Process p=new ProcessBuilder(cmd).start();

这里有一点需要注意,runtime执行执行命令,processBuilder需要具体的文件

runtime的cmd:  String copy="cp -rf "+source+" "+target;

processBuilder的cmd:  这里读的是配置文件中的

video.ffmpeg.linux.path=/usr/local/ffmpegRedHat/bin/./ffmpeg
video.ffmpeg.windows.path=D:\\project\\solr\\changToH264\\src\\ffmpeg.exe

开头不太一样。。

我目前直接用的ffmpeg,这里粘一下我的源码,可以做一下参考

@Override
public boolean startChangeToH264(String inputPath, String outPath) throws Exception{// ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)if (!checkfile(inputPath)) {System.out.println(inputPath + " is not file");throw new Exception("文件不存在");}if(checkContentType(inputPath)!=0){throw new Exception("文件类型无法解析");}VideoFormatToH264 videoFormatToH264=new VideoFormatToH264(inputPath,outPath);videoFormatToH264.run();return true;
}private static boolean checkfile(String path) {File file = new File(path);if (!file.isFile() || (!file.exists())) {return false;}return true;
}private static int checkContentType(String inputPath) {String type = inputPath.substring(inputPath.lastIndexOf(".") + 1, inputPath.length()).toLowerCase();// ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)if (type.equals("avi")) {return 0;} else if (type.equals("mpg")) {return 0;} else if (type.equals("wmv")) {return 0;} else if (type.equals("3gp")) {return 0;} else if (type.equals("mov")) {return 0;} else if (type.equals("mp4")) {return 0;} else if (type.equals("asf")) {return 0;} else if (type.equals("asx")) {return 0;} else if (type.equals("flv")) {return 0;}// 对ffmpeg无法解析的文件格式(wmv9,rm,rmvb等),// 可以先用别的工具(mencoder)转换为avi(ffmpeg能解析的)格式.else if (type.equals("wmv9")) {return 1;} else if (type.equals("rm")) {return 1;} else if (type.equals("rmvb")) {return 1;}return 9;
}
/*** Created by zhangluyao on 2018/6/12.*/
public class VideoFormatToH264 {private String filePath;private String OutfilePath;private List<String> command;public VideoFormatToH264(String filePath,String OutfilePath){this.OutfilePath=OutfilePath;this.filePath=filePath;}public VideoFormatToH264(String filePath,String OutfilePath, List<String> command){this.OutfilePath=OutfilePath;this.filePath=filePath;this.command=command;}public void run(){ThreadPoolTaskExecutor threadPoolTaskExecutor=(ThreadPoolTaskExecutor)SpringUtil.getBean("threadPoolTaskExecutor");ChangeVideoTask changeVideoTask=new ChangeVideoTask(this.getFilePath(),this.getOutfilePath());threadPoolTaskExecutor.execute(changeVideoTask);}public void runCommand()throws Exception{if(this.command!=null){ThreadPoolTaskExecutor threadPoolTaskExecutor=(ThreadPoolTaskExecutor)SpringUtil.getBean("threadPoolTaskExecutor");ChangeVideoTask changeVideoTask=new ChangeVideoTask(this.getFilePath(),this.getOutfilePath(),this.command);threadPoolTaskExecutor.execute(changeVideoTask);}else{System.out.print("command为空");throw new Exception("command为空");}}private class ChangeVideoTask implements Runnable{private String filePath;private String outFilePath;private List<String> command;ChangeVideoTask(String path,String outFilePath){this.outFilePath=outFilePath;this.filePath=path;}ChangeVideoTask(String path,String outFilePath,List<String> command){this.outFilePath=outFilePath;this.filePath=path;this.command=command;}@Overridepublic  void run() {try {//命令是空时,执行视频转换成H264if(CollectionUtils.isEmpty(command)){command=new ArrayList<String>();command.add(Const.getFFMPEGPath());command.add("-i");command.add(filePath);command.add("-y");command.add("-vcodec");command.add("h264");command.add("-preset");command.add("ultrafast");command.add("-profile:v");command.add("baseline");command.add("-acodec");command.add("aac");command.add("-strict");command.add("experimental");command.add("-s");command.add("640*480");command.add("-b");command.add("568k");command.add("-ab");command.add("128k");if(System.getProperty("os.name").toLowerCase().indexOf("windows")>-1){command.add(outFilePath.substring(1));}else{command.add(outFilePath);}}System.out.println("开始转换");Process videoProcess = new ProcessBuilder(command).redirectErrorStream(true).start();new PrintStream(videoProcess.getErrorStream()).start();new PrintStream(videoProcess.getInputStream()).start();videoProcess.waitFor();//等待进程结束CacheService cacheService=(CacheService) SpringUtil.getBean("cacheService");String sourceName=filePath.substring(filePath.lastIndexOf("/")+1);//转换成功,去掉redis中的keycacheService.remove(sourceName);System.out.println("转换成功");FileUtils.delFile(filePath);} catch (Exception e) {e.printStackTrace();}}}private class PrintStream extends Thread{java.io.InputStream __is = null;public PrintStream(java.io.InputStream is){__is = is;}public void run(){try{while(this != null){int _ch = __is.read();if(_ch != -1)System.out.print((char)_ch);else break;}}catch (Exception e){e.printStackTrace();}}}public String getFilePath() {return filePath;}public void setFilePath(String filePath) {this.filePath = filePath;}public String getOutfilePath() {return OutfilePath;}public void setOutfilePath(String outfilePath) {OutfilePath = outfilePath;}public List<String> getCommand() {return command;}public void setCommand(List<String> command) {this.command = command;}

加点东西。

ffmpeg转换成mp4文件以后,视频的元数据在末尾,jwplayer播放的时候需要全部缓冲结束才能开始播放,用户体验及其的不好~~   更改后的代码先不贴上来了,就说下方法。

ffmpeg文件夹中,编译前的文件夹,tools下面有一个qt-faststart.c

执行下make qt-faststart   会生成一个qt-faststart 命令

然后代码中对文件 再执行一下  qt-faststart  inputPath outPath  命令 就可以了

会生成一个新的文件,这个文件的元数据在开头,可以直接播放的

视频转码(Java)相关推荐

  1. Java实现视频网站的视频上传、视频转码、视频关键帧抽图, 及视频播放功能

    最近有个项目牵扯到上传视频,简直把我搞炸了.还么搞定,主要是当初设计有点小出入,心里一直不是坚持,所以,哎,还得努力撒! 下面是当时参考,睡觉,明天搞哎.http://www.cnblogs.com/ ...

  2. java 视频转码 视频压缩

    视频相关概念 视频(Video)泛指将一系列静态影像以电信号的方式加以捕捉.记录.处理.储存.传送与重现的各种技术.连续的图像变化每秒超过24帧(frame)画面以上时,根据视觉暂留原理,人眼无法辨别 ...

  3. 如何用java代码调用ffmpeg进行视频转码

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/lushizhuo9655/articl ...

  4. JAVA调用FFmpeg实现音视频转码加水印功能

    目录 目录 写在前面 MAVEN引用 获取音视频基本信息 音频转码成Mp3格式 视频转码成Mp4格式 视频转码成Mp4并添加文字水印 视频转码成Mp4并添加图片水印 测试代码 写在前面 如今各大云厂商 ...

  5. 实战突击JAVA开发项目_《实战突击Java项目开发案列整合》随书资料(视频+源码)_源雷技术空间...

    资源名称:<实战突击Java项目开发案列整合>随书资料(视频+源码) 资源目录: [IT教程网]第1-9_11-15_18_20_21章 [IT教程网]第10章BBS论坛 [IT教程网]第 ...

  6. 你会写java视频转码的工具吗?

    是的,我会写Java视频转码的工具.视频转码是一种将视频从一种格式转换为另一种格式的过程.通常,这是为了使视频能够在不同的设备上播放,或者为了减小视频文件的大小.Java是一种流行的编程语言,可以用来 ...

  7. java图片和视频上传_Java实现视频网站的视频上传、视频转码、视频关键帧抽图, 及视频播放功能(转)...

    视频网站中提供的在线视频播放功能,播放的都是FLV格式的文件,它是Flash动画文件,可通过Flash制作的播放器来播放该文件.项目中用制作的player.swf播放器. 多媒体视频处理工具FFmpe ...

  8. java通知图库更新视频_Java实现视频网站的视频上传、视频转码、视频关键帧抽图, 及视频播放功能...

    视频网站中提供的在线视频播放功能,播放的都是FLV格式的文件,它是Flash动画文件,可通过Flash制作的播放器来播放该文件.项目中用制作的player.swf播放器. 多媒体视频处理工具FFmpe ...

  9. java中视频转码实现

    这个需要用到第三方工具~纯java的视频转码软件我还真没见过,有见过的大佬可以分享一下. 强大的工具:ffmpeg 先安装,windows,linux版本自行选择,去官网下载,这个工具很强大支持很多视 ...

  10. html高仿抖音,最新高仿抖音短视频APP应用原生双端源码(java源生源码)

    [原生抖音短视频]19年11月最新高仿抖音短视频APP应用原生双端源码[java原生源码] 安卓语言是:android stdio 苹果语言是:OC 环境php5.6 sql5.5 伪静态设置thin ...

最新文章

  1. VMware Fusion配置CentOS系统
  2. uploadify动态改变参数
  3. Java 8.9 游戏:井字游戏(C++Java)
  4. uber大数据_Uber创建了深度神经网络以为其他深度神经网络生成训练数据
  5. 钱天财8.25黄金白银在线分析及黄金在线解套
  6. 一次量产恢复U盘真实容量的操作过程(安国主控芯片)
  7. pushbutton flash 游戏开发
  8. 计算机二级幻灯片母版奇数页,计算机二级office考试中PPT母版知识考察点有哪些...
  9. 计算机主题绘画能画什么,电脑绘画活动方案
  10. ITK入门教程(13)点集之得到点中的存储数据
  11. 华硕A8SE系列安装windows XP +驱动安装
  12. 对LBP与HOG的理解
  13. html 中按钮控件变为透明,css如何实现按钮透明
  14. 找不到bridge.dll文件
  15. stream流的应用与并行流
  16. mini2440裸机音乐播放器(非常久曾经的笔记)
  17. 【ML复习】什么是 监督学习,什么是 非监督学习?二者的区别是什么?列举常见的 监督学习算法 和 非监督学习算法。
  18. 欧几里德算法 扩展欧几里德算法
  19. Discuz!教程之大型Discuz!论坛站点帖子表forum_post分表方案优化
  20. 计算机辅助绘制地图是数字图像,基于遥感数字图像的电子教学地图的制作.pdf...

热门文章

  1. zip命令 – 压缩文件
  2. 身份证前6位编码与地址对应关系表
  3. iOS AppStore Search optimize【 ASO项目使用的技术】之切换IP(基于CFRunLoopDoSources0自定义Operation执行切换IP任务)
  4. 塑胶产品内滑块设计要点,以及注意哪些事项?
  5. 编程必备的最基本5种算法思想
  6. 如何使用阿里云矢量图标库
  7. 超全 泛微 E8 E-cology 8 开发资料大全 开源下载资料
  8. vs2010 c语言乱码,从vs2010中复制带有中文字符的代码到office等时出现乱码的解决方案.doc...
  9. Spotfire 修改标记及颜色
  10. 如何利用手机的OCR文字识别功能制作扫描件?