前端用的是HTML5的<video>标签播放的视频。由于其并不能支持所有视频类型的播放,所以我们需要把视频转码为其支持的编码如h264。否则会出现黑屏只有声音没有图像的问题。

网上的方法大多是转成flv的,这里,我把它转成mp4。直接调用Conver的run(filepath);就可

参数解释:

-acodec //音频的编码 这里使用copy直接用原来的不用转提供速率
-vcodec //视频的编码 这里使用libx264
-preset //该参数主要调节编码速度和质量的平衡 其的值从快到慢有 ultrafast、superfast、veryfast、faster、
fast、medium、slow、slower、veryslow和placebo这10个。这里选个比较快的superfast

ConverVideo.java


import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;
public class ConverVideo {

    private Date dt;private long begintime;private String PATH;private String filerealname; // 文件名 不包括扩展名private String filename; // 包括扩展名private String videofolder = "F:\\upload\\video\\other\\"; // 别的格式视频的目录private String mp4folder = "F:\\upload\\mp4video\\"; // mp4成功后视频的目录private String ffmpegpath = "F:\\upload\\ffmpeg\\bin\\ffmpeg.exe"; // ffmpeg.exe的目录private String mencoderpath = "F:\\video\\mencoder\\"; // mencoder的目录private String videoRealPath = "F:\\upload\\mp4video\\mp4\\"; // 截图的视频目录;private String imageRealPath = "F:\\upload\\mp4video\\img\\"; // 截图的存放目录public ConverVideo() {}public ConverVideo(String path) {PATH = path;}public String getPATH() {return PATH;}public void setPATH(String path) {PATH = path;}public boolean beginConver() {File fi = new File(PATH);filename = fi.getName();filerealname = filename.substring(0, filename.lastIndexOf(".")).toLowerCase();System.out.println("----接收到文件(" + PATH+ ")需要转换-------------------------- ");if (!checkfile(PATH)) {System.out.println(PATH + "文件不存在" + " ");return false;}dt = new Date();begintime = dt.getTime();System.out.println("----开始转文件(" + PATH + ")-------------------------- ");if (process()) {Date dt2 = new Date();System.out.println("转换成功 ");long endtime = dt2.getTime();long timecha = (endtime - begintime);String totaltime = sumTime(timecha);System.out.println("共用了:" + totaltime + " ");if (processImg()) {System.out.println("截图成功了 ");} else {System.out.println("截图不成功了 ");}PATH = null;return true;} else {PATH = null;return false;}}public boolean processImg() {List commend = new java.util.ArrayList();commend.add(ffmpegpath);commend.add("-i");commend.add(videoRealPath + filerealname + ".flv");commend.add("-y");commend.add("-f");commend.add("image2");commend.add("-ss");commend.add("38");commend.add("-t");commend.add("0.001");commend.add("-s");commend.add("320x240");commend.add(imageRealPath + filerealname + ".jpg");try {ProcessBuilder builder = new ProcessBuilder();builder.command(commend);builder.start();return true;} catch (Exception e) {e.printStackTrace();return false;}}private boolean process() {int type = checkContentType();boolean status = false;if (type == 0) {status = processMp4(PATH);} else if (type == 1) {String avifilepath = processAVI(type);if (avifilepath == null)return false;// avi文件没有得到else {System.out.println("kaishizhuang");status = processMp4(avifilepath);// 将avi转为mp4}}return status;}private int checkContentType() {String type = PATH.substring(PATH.lastIndexOf(".") + 1, PATH.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;}private boolean checkfile(String path) {File file = new File(path);if (!file.isFile()) {return false;} else {return true;}}// 对ffmpeg无法解析的文件格式(wmv9,rm,rmvb等), 可以先用别的工具(mencoder)转换为avi(ffmpeg能解析的)格式.private String processAVI(int type) {List commend = new java.util.ArrayList();commend.add(mencoderpath);commend.add(PATH);commend.add("-oac");commend.add("mp3lame");commend.add("-lameopts");commend.add("preset=64");commend.add("-ovc");commend.add("xvid");commend.add("-xvidencopts");commend.add("bitrate=600");commend.add("-of");commend.add("avi");commend.add("-o");commend.add(videofolder + filerealname + ".avi");// 命令类型:mencoder 1.rmvb -oac mp3lame -lameopts preset=64 -ovc xvid// -xvidencopts bitrate=600 -of avi -o rmvb.avitry {ProcessBuilder builder = new ProcessBuilder();builder.command(commend);Process p = builder.start();doWaitFor(p);return videofolder + filerealname + ".avi";} catch (Exception e) {e.printStackTrace();return null;}}// ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)private boolean processMp4(String oldfilepath) {if (!checkfile(PATH)) {System.out.println(oldfilepath + " is not file");return false;}List commend = new java.util.ArrayList();commend.add(ffmpegpath);commend.add("-i");commend.add(oldfilepath);commend.add("-acodec");commend.add("copy");commend.add("-vcodec");commend.add("libx264");commend.add("-preset");commend.add("superfast");commend.add("-y");      commend.add(mp4folder + filerealname + ".mp4");try {ProcessBuilder builder = new ProcessBuilder();String cmd = commend.toString();builder.command(commend);Process p = builder.start();doWaitFor(p);p.destroy();deleteFile(oldfilepath);return true;} catch (Exception e) {e.printStackTrace();return false;}}public int doWaitFor(Process p) {InputStream in = null;InputStream err = null;int exitValue = -1; // returned to caller when p is finishedtry {System.out.println("comeing");in = p.getInputStream();err = p.getErrorStream();boolean finished = false; // Set to true when p is finishedwhile (!finished) {try {while (in.available() > 0) {Character c = new Character((char) in.read());System.out.print(c);}while (err.available() > 0) {Character c = new Character((char) err.read());System.out.print(c);}exitValue = p.exitValue();finished = true;} catch (IllegalThreadStateException e) {Thread.currentThread().sleep(500);}}} catch (Exception e) {System.err.println("doWaitFor();: unexpected exception - "+ e.getMessage());} finally {try {if (in != null) {in.close();}} catch (IOException e) {System.out.println(e.getMessage());}if (err != null) {try {err.close();} catch (IOException e) {System.out.println(e.getMessage());}}}return exitValue;}public void deleteFile(String filepath) {File file = new File(filepath);if (PATH.equals(filepath)) {if (file.delete()) {System.out.println("文件" + filepath + "已删除");}} else {if (file.delete()) {System.out.println("文件" + filepath + "已删除 ");}File filedelete2 = new File(PATH);if (filedelete2.delete()) {System.out.println("文件" + PATH + "已删除");}}}public String sumTime(long ms) {int ss = 1000;long mi = ss * 60;long hh = mi * 60;long dd = hh * 24;long day = ms / dd;long hour = (ms - day * dd) / hh;long minute = (ms - day * dd - hour * hh) / mi;long second = (ms - day * dd - hour * hh - minute * mi) / ss;long milliSecond = ms - day * dd - hour * hh - minute * mi - second* ss;String strDay = day < 10 ? "0" + day + "天" : "" + day + "天";String strHour = hour < 10 ? "0" + hour + "小时" : "" + hour + "小时";String strMinute = minute < 10 ? "0" + minute + "分" : "" + minute + "分";String strSecond = second < 10 ? "0" + second + "秒" : "" + second + "秒";String strMilliSecond = milliSecond < 10 ? "0" + milliSecond : ""+ milliSecond;strMilliSecond = milliSecond < 100 ? "0" + strMilliSecond + "毫秒" : ""+ strMilliSecond + " 毫秒";return strDay + " " + strHour + ":" + strMinute + ":" + strSecond + " "+ strMilliSecond;}}

Conver.java

package com.lrm.common.utils;public class Conver {public void run(String filePath) {try {ConverVideo cv = new ConverVideo(filePath);cv.beginConver();} catch (Exception e) {e.printStackTrace();}}}

成功转码如图:

解决H5播放视频黑屏只有声音没有图像的问题,Java调用ffmpeg转码成h264的mp4格式相关推荐

  1. 看完这篇文章,彻底解决Mediaplayer重复播放视频黑屏的问题

    最近做的一个项目中有一个需求需要重复播放本地目录下的一小段视频,但是在做的过程中发现重复播放视频每次重头放的时候都会闪黑屏半秒钟.最开始我用的是VideoView+MediaController,后来 ...

  2. php ffmpeg 转码mp4,PHP+FFMPEG实现将视频自动转码成H264标准Mp4文件

    配置php.ini文件 file_uploads = on ;//是否允许通过HTTP上传文件的开关.默认为ON即是开 upload_tmp_dir ;//文件上传至服务器上存储临时文件的地方,如果没 ...

  3. 解决Chrome播放视频闪屏黑屏无法播放

    解决方法 先说解决方法:Chrome→设置→硬件加速→关闭.如下图. 之前遇到的问题 使用 Chrome 浏览网页的时候,遇到自动播放的视频,有大概率会整个 Chrome 浏览器闪一下,闪屏变黑一秒钟 ...

  4. edge播放视频HTML5黑屏,Win10 edge浏览器播放视频黑屏解决方法

    Edge看不了视频怎么办呢? 出现这样的问题是由于Edge浏览器中需要点击允许才能看视频,但如果不弹出提示窗口我们就无法正常观看视频,所以当我们遇到这样的情况可以按下面方法进行操作! Edge看不了视 ...

  5. VideoView播放视频黑屏问题处理

    前言 你又擦肩而过 你耳机听什么 能不能告诉我 --. 记得 我写给你的情书 都什么年代了 到现在我还在写着 总有一天总有一年会发现 有人默默的陪在你的身边 也许 我不该在你的世界 当你收到情书 也代 ...

  6. ubuntu 播放视频黑屏,没声音没画面,无法播放视频怎么办--已解决

    我的系统是新装的,出现了这个问题,下面是转发内容,解决了我的问题: . SMPlayer 是免费开源的媒体播放器,内置的解码器,在Linux和Windows下几乎可以播放所有的视频和音频格式.它不需要 ...

  7. 解决WIN10播放AVI等格式视频黑屏只有声音的问题

    需要用到的软件:K-Lite Codec Pack 下载地址: http://www.codecguide.com/download_kl.htm K-Lite Codec Pack是世界闻名,备受好 ...

  8. 直播Html5播放器黑屏有声音,html5media 在IE8播放视频黑屏

    (以下是我做的笔记) 使用html5media.js的时候 官网提示你只需要引入这个js就行了 但是实际使用中发现不管是本地文件协议还是http协议在ie8下都无法打开视频或音频 报的错都是无法找到/ ...

  9. 关于Chrome播放视频黑屏解决办法。

    安装完系统,安装了chrome.可是看视频却发现一篇漆黑... 没想到啊,没想到.解决办法折磨简单. 关闭硬件加速. 后面图片咋上传不了啊! 转载于:https://my.oschina.net/sk ...

最新文章

  1. android百度地图更换定位图标,android百度地图定位,改变MyLocationOverlay默认图标(原始为蓝色点)(两种方法)...
  2. 第四范式先知(Sage)率先通过欧盟GDPR认证
  3. [CQOI2012] 局部极小值(状压DP + 容斥 + 搜索)
  4. shiro会话监听_SpringBoot集成Shiro会话管理
  5. python-flask-1
  6. SpringScerity的使用
  7. 见过一个一个拉新地推没见过这么多一起推
  8. 21天jmeter打卡day5-完成对www.baidu.com的两条接口测试
  9. Java大厂面试题:从 JVM 角度说进程和线程之间的关系
  10. java day32【HTML标签:表单标签 、CSS】
  11. Intellij IDEA配置优化--转载
  12. qrect在图片上显示矩形框_Mac上用LabelImg手动标记图片
  13. 【图像加密】基于matlab GUI+Logistic+Tent+Kent+Henon图像加密与解密【含Matlab源码 1745期】
  14. mysql hibernate 乱码_mysql hibernate 乱码
  15. 001 红黑树(二)之 C语言的实现(3)
  16. CUDA优化LBP(loopy belief propegation)
  17. 哈工大c语言作业,哈工大c语言-练习题
  18. 宁夏召开外派教师家属新春慰问座谈会
  19. opencv 处理黑夜_Python基于OpenCV的固定位置半透明水印去除两种方案
  20. 杨辉三角中第 n 行第 m 个数字

热门文章

  1. 【RPA资讯】Uipath估值70亿美金,超越OMV Petrom成罗马尼亚最有价值公司
  2. GhostNets on Heterogeneous Devices via Cheap Operations
  3. 在Java中操作MySQL(JDBC)
  4. 微信小程序 - 收藏集 - 掘金
  5. 莫斯科计划在 17 万个监控摄像头中引入人脸识别;广东农行“刷脸取款”实现 1600 多个网点全覆盖...
  6. ElasticSearch中Cat接口详解
  7. 番茄工作法,定时提醒小程序,番茄计时器
  8. NTP服务端和客户端的部署——Chrony
  9. 计算机网络期末大题汇总
  10. 医疗大数据模型:医疗保险欺诈发现大数据模型