技术标签: day14 媒资管理
1.2.2 视频处理技术方案
如何通过程序进行视频处理?
ffmpeg是一个可行的视频处理程序,可以通过Java调用ffmpeg.exe完成视频处理。
在java中可以使用Runtime类和Process Builder类两种方式来执行外部程序,工作中至少掌握一种。
本项目使用Process Builder的方式来调用ffmpeg完成视频处理。
关于Process Builder的测试如下:
@Test
public void testProcessBuilder() throws IOException {
//创建ProcessBuilder对象
ProcessBuilder processBuilder =new ProcessBuilder();
//设置执行的第三方程序(命令)
processBuilder.command("ping","127.0.0.1");
//processBuilder.command("ipconfig");
// processBuilder.command("java","-jar","f:/xc-service-manage-course.jar");
//将标准输入流和错误输入流合并,通过标准输入流读取信息就可以拿到第三方程序输出的错误信息、正常信息
processBuilder.redirectErrorStream(true);
//启动一个进程
Process process = processBuilder.start();
//由于前边将错误和正常信息合并在输入流,只读取输入流
InputStream inputStream = process.getInputStream();
//将字节流转成字符流
InputStreamReader reader = new InputStreamReader(inputStream,"gbk");
//字符缓冲区
char[] chars = new char[1024];
int len = -1;
while((len = reader.read(chars))!=-1){
String string = new String(chars,0,len);
System.out.println(string);
}
inputStream.close();
reader.close();
}
@Test
public void testFFmpeg() {
ProcessBuilder processBuilder = new ProcessBuilder();
//定义命令内容
List<String> command = new ArrayList<>();
command.add("E:\\java_soft\\ffmpeg-20180227-fa0c9d6-win64-static\\bin\\ffmpeg.exe");
command.add("‐i");
command.add("E:\\java_www\\ffmpeg_test\\lucene.avi");
command.add("‐y");//覆盖输出文件
command.add("‐c:v");
command.add("libx264");
//测试使用工具类将avi转成mp4
command.add("‐s");
command.add("1280x720");
command.add("‐pix_fmt");
command.add("yuv420p");
command.add("‐b:a");
command.add("63k");
command.add("‐b:v");
command.add("753k");
command.add("‐r");
command.add("18");
command.add("E:\\java_www\\ffmpeg_test\\1.mp4");
processBuilder.command(command);
//将标准输入流和错误输入流合并,通过标准输入流读取信息
processBuilder.redirectErrorStream(true);
try {
//启动进程
Process start = processBuilder.start();
//获取输入流
InputStream inputStream = start.getInputStream();
//转成字符输入流
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "gbk");
int len = -1;
char[] c = new char[1024];
StringBuffer outputString = new StringBuffer();
//读取进程输入流中的内容
while ((len = inputStreamReader.read(c)) != -1) {
String s = new String(c, 0, len);
outputString.append(s);
System.out.print(s);
}
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
这种方式太麻烦,所以改为以下方式
上边的代码已经封装成工具类,参见:
上边的工具类中:
Mp4VideoUtil.java完成avi转mp4
HlsVideoUtil.java完成mp4转hls
分别测试每个工具类的使用方法。
@Test
public void testProcessMp4() {
//String ffmpeg_path, String video_path, String mp4_name, String mp4folder_path
//ffmpeg的路径
String ffmpeg_path = "E:\\java_soft\\ffmpeg-20180227-fa0c9d6-win64-static\\bin\\ffmpeg.exe";
//video_path视频地址
String video_path = "E:\\java_www\\ffmpeg_test\\lucene.avi";
//mp4_name mp4文件名称
String mp4_name = "1.mp4";
//mp4folder_path mp4文件目录路径
String mp4folder_path = "E:/java_www/ffmpeg_test/";
Mp4VideoUtil mp4VideoUtil = new Mp4VideoUtil(ffmpeg_path, video_path, mp4_name, mp4folder_path);
//开始编码,如果成功返回success,否则返回输出的日志
String result = mp4VideoUtil.generateMp4();
System.out.println(result);
}
文章浏览阅读1.6k次。注:以下以名为Test的对话框工程为例讲解对话框程序中,如果我们有拖标准控件到界面中,并且有和控件类变量绑定,则会有void CTestDlg::DoDataExchange(CDataExchange* pDX){ CDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_BTN_TEST, m_testBtn); D..._ddx_control
文章浏览阅读593次。在上一篇文章 神经网络学习2【分类器+升华至神经元 搭建神经网络】中由浅入深的理解了从分类器开始如何理解神经网络的内部计算。接下来我们借用数学工具去逐步推导其计算公式,并同时建立出Python代码框架。1.神经网络公式推导1.1两层神经网络计算尝试使用只有两层、每层两个神经元的较小的神经网络,来演示神经网络如何工作:两个输入值分别为1.0和0.5,每个节点使用激活函数。使用一些随机权重:第一层仅作输入层,不需要使用激活函数。第二层中需要做一些计算,以及使用激活函数,当然,在这个简单的网络_神经网络计算流程
文章浏览阅读1.9k次。最近几年,随着短视频、小程序、直播带货的火爆,前端开发工程师越来越热门,薪资待遇也快接近后端开发工程师了,前端领域进化为内卷重灾区。然而伴随着 Vue 3.0 的发布,前端技术也迎来了一次大革新,像是字节跳动、腾讯等开始重点考察,前端程序员对 Vue 3 框架的理解和实际应用能力。不再是当年懂个生命周期、虚拟 DOM,就可以轻松进大厂的时代了。同时网上也掀起了一股学习 Vue 3 的热潮,面对着网..._手撕vue3 双向
文章浏览阅读5.5k次。ITRON系统使用方法目录1引言 42ITRON系统介绍 52.1概要 52.2构成 52.2.1ITRON系统构成 52.2.2ITRON体系结构 52.3应用领域 62.4如何使用ITRON系统 63ITRON的基本机能 83.1Task管理机能 83.1.1Task 83.1.2任务调_itron操作系统
文章浏览阅读3.4w次,点赞24次,收藏147次。前言声明: 所有计算基于R软件,如果有人问其他软件如何实现,请自行Google。评价一个预测模型的表现可以从三方面来度量:区分能力(discrimination): 指的是模型区分有病/没病,死亡/活着等结局的预测能力。简单举个例子,比如说,现有100个人,50个有病,50个健康;你用预测模型预测出46个有病,54个没病。那么这46个覆盖到50个真正有病的人的多少就直接决定了你模型_模型之间c statistics的比较方法
文章浏览阅读2.2w次。今天更新webservices的时候,如下图: 报出了下面的错误: 在服务端打开asmx文件时,错误信息如下:“/”应用程序中的服务器错误。未能加载文件或程序集“Oracle.DataAccess”或它的某一个依赖项。试图加载格式不正确的程序。说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈_system.badimageformatexception: 未能加载文件或程序集“oracle.dataaccess”或
文章浏览阅读1.5k次。欢迎来到Apache Zeppelin!本页面是有助于开始使用的说明。安装Apache Zeppelin正式支持并在以下环境下进行测试:NameValueOracle JDK1.7 (set JAVA_HOME)OSMac OSX Ubuntu 14.X _apache zeppelin 正式版本
文章浏览阅读5.1k次。1.UIImageView中的视图内容显示模式 UIImageView *imageV=[[UIImageViewalloc]init]; imageV.scaleToFill------默认缩放填充; imageV.scaleAspectfit-------有留白; imageV.AspectFill------自适应填充,视图会被裁剪;..._uiimageview image
文章浏览阅读4.6k次。Last login: Mon Feb 25 04:53:40 2019 from 10.0.0.3[root@vmhzpmysql ~]# df -hlFilesystem Size Used Avail Use% Mounted on/dev/mapper/centos-root 4.4G 3.5G 962M 79% /devtmpfs ..._ivextend -l 1.95t /dev/mapper/centos-rootrounding size to boundary between p
文章浏览阅读6.1k次。SolidWorks生成URDF文件,并配置本文主要讲解如何生成URDF,然后通过MoveIt Setup Assistant配置urdf文件。主要有以下几点: 1:sw_urdf_exporter插件。 2:配置生成可执行的包。(插件生成的是ros包,不是简单的文件_solidworks 并联机构urdf设置
文章浏览阅读8.2k次,点赞2次,收藏4次。关于farpoint如何设置 单元格换行 及自动调整行高 行宽。FarPoint.Win.Spread.CellType.TextCellType text = newFarPoint.Win.Spread.CellType.TextCellType(); text.Multiline = true; _farpoint 自动换行
文章浏览阅读724次。今天重新搭建一套Android开发环境,按照步骤在eclipse中install ADT的时候出错接下来点之后出现以下错误Cannot complete the install because one or more required itemscould not be found.Software being installed: Android Development T