<dependency>
<groupId>org.apache.storm</groupId>
<artifactId>storm-core</artifactId>
<version>1.1.0</version>
</dependency>
<dependency>
<groupId>org.apache.storm</groupId>
<artifactId>storm-kafka</artifactId>
<version>1.0.4</version>
</dependency>
<dependency>
<groupId>org.jcodec</groupId>
<artifactId>jcodec</artifactId>
<version>0.2.5</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.humble</groupId>
<artifactId>humble-video-all</artifactId>
<version>0.3.0</version>
</dependency>
<dependency>
<groupId>org.mp4parser</groupId>
<artifactId>isoparser</artifactId>
<version>1.9.39</version>
</dependency>

合并ffmpeg切割的hls音视频碎片文件


 /***
*https://stackoverflow.com/questions/38123693/how-to-concatenate-merge-two-videos-in-a-new-video-file-in-java
* @param aggregate 合并待输出文件
* @param segments MPEG transport stream(FFMpeg mpegts)、 MPEG-2 TS视频;波形声音
* @throws InterruptedException
* @throws IOException
*/
private void merge(File aggregate, Collection<File> segments) throws InterruptedException, IOException { Muxer muxer = Muxer.make(aggregate.toString(), MuxerFormat.getFormat(96), "wav"); final MediaPacket packet = MediaPacket.make();
long dts_offset = 0;
long pts_offset = 0; for (File segment : segments) {
Demuxer demuxer = Demuxer.make();
//option https://ffmpeg.org/ffmpeg-formats.html
demuxer.open(segment.toString(), null, false, true, null, null);
if (muxer.getState() == Muxer.State.STATE_INITED) {
int numStreams = demuxer.getNumStreams();
for (int s = 0; s < numStreams; s++) {
DemuxerStream demuxerStream = demuxer.getStream(s);
Decoder decoder = demuxerStream.getDecoder();
muxer.addNewStream(decoder);
}
muxer.open(null, null);
}
long dts_max = 0;
long pts_max = 0;
while (demuxer.read(packet) >= 0) {
if (packet.isComplete()) {
packet.setDts(packet.getDts() + dts_offset);
packet.setPts(packet.getPts() + pts_offset);
dts_max = packet.getDts() + 1;
pts_max = packet.getPts() + 1; muxer.write(packet, false);
}
}
dts_offset = dts_max;
pts_offset = pts_max;
demuxer.close();
}
muxer.close();
}
@Test
public void testFormat()
{
MuxerFormat format = MuxerFormat.getFormat(128);
System.out.println(format);
Collection<MuxerFormat> formats = MuxerFormat.getFormats();
formats.stream().forEach(this::out);
} void out(MuxerFormat format)
{
System.out.printf("%s %s\n",format.getName(),format.getMimeType());
}
@Test
public void test() throws IOException, InterruptedException {
String directory = "C:\\Users\\Administrator\\AppData\\Local\\Temp\\8ad088a2-0bb3-41dc-89d9-2c57ef8414b0";
List<File> files = Files.list(Paths.get(directory)).map(path -> path.toFile()).filter(file -> file.getName().endsWith(".ts"))
.collect(Collectors.toList());
File dest = new File(directory+"\\dest.wav");
merge(dest,files);
}

java多媒体文件编码、处理工具类的更多相关文章

  1. Rhino+envjs-1.2.js 在java运行网站js 工具类

    java爬虫遇到个页面加密的东西,找了些资料学习学习 做了个java运行js的工具类,希望对大家有用,其中用到client(获取js)可以自行换成自己的client.主要是用了 Rhino就是Java ...

  2. java中常用的工具类(一)

    我们java程序员在开发项目的是常常会用到一些工具类.今天我汇总了一下java中常用的工具方法.大家可以在项目中使用.可以收藏!加入IT江湖官方群:383126909 我们一起成长 一.String工 ...

  3. Java学习-041-颜色工具类(RGB,HEX)

    在日常的网页开发中,经常需要进行颜色数值获取.转换,例如获取红色,获取蓝色,获取绿色,RGB转十六进制颜色,十六进制颜色转RGB等,因而在学习过程中,写了一个小工具类,仅供各位小主参考! 多不闲言,直 ...

  4. JAVA中封装JSONUtils工具类及使用

    在JAVA中用json-lib-2.3-jdk15.jar包中提供了JSONObject和JSONArray基类,用于JSON的序列化和反序列化的操作.但是我们更习惯将其进一步封装,达到更好的重用. ...

  5. JAVA自动生成正则表达式工具类

    经过很久的努力,终于完成了JAVA自动生成正则表达式工具类.还记得之前需要正则,老是从网上找吗?找了想修改也不会修改.现在不用再为此烦恼了,使用此生成类轻松搞定所有正则表达式.赶快在同事面前炫一下吧. ...

  6. java 二进制数字符串转换工具类

    java 二进制数字符串转换工具类 将二进制转换成八进制 将二进制转换成十进制 将二进制转换成十六进制 将十进制转换成二进制 package com.iteye.injavawetrust.ad; i ...

  7. Java学习-049-正则工具类

    自去年九月份决定再次入学和职业资格进阶,开始备战二者考试至今,以及当下进行中的职称申请,犹如孤独的狼,不断前行在路上,而今凡凡总总的已历8月... 不感慨了,如下为一园友需要的正则工具类,直接上码: ...

  8. Java 后台验证的工具类

    Java 后台验证的工具类 public class ValidationUtil {         //手机号     public static String mobile = "^( ...

  9. java后端时间处理工具类,返回 "XXX 前" 的字符串

    转自:https://www.cnblogs.com/devise/p/9974672.html 我们经常会遇到显示 "某个之间之前" 的需求(比如各种社交软件,在回复消息时,显示 ...

  10. Java日期时间实用工具类

    Java日期时间实用工具类 1.Date (java.util.Date)    Date();        以当前时间构造一个Date对象    Date(long);        构造函数   ...

随机推荐

  1. vue中父组件使用props或者$attras向子组件中传值

    知识点:vue中使用props或者$attras向子组件中传值 (1) props传值 子组件必须注册好要传的数据() props:['id'] (2)$attrs传值 该数据在props中,没有注册 ...

  2. git 版本落后推送错误

     http://114.215.90.144/student_association/student.git ! [rejected]        master -> master (non- ...

  3. 使用原生js 实现点击消失效果

    JQ版 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title ...

  4. config文件的实现

    https://www.cnblogs.com/jiayouwyhit/p/3836510.html //Config.h #pragma once #include <string> # ...

  5. MULTIPOLYGON、POLYGON 封装为echart geoJson 数据封装

    一.环境.问题简述: 1.采用的事前后端分离,后端需要封装将点位获取的点位信息封装为geoJson数据类型,供前端利用echart 绘制地图: 2.思路:简单理解geoJson,将对应坐标点位封装为g ...

  6. RabbitMQ概要

    安装: 1.Erlang安装 安装RabbitMQ需要先安装Erlang,这里选择otp21.2-win-64下载完成后安装 资源: http://www.erlang.org/downloads 2 ...

  7. Java HashMap实现原理分析

    参考链接:https://www.cnblogs.com/xiarongjin/p/8310011.html 1. HashMap的数据结构 数据结构中有数组和链表来实现对数据的存储,但这两者基本上是 ...

  8. Connect AS400 through firewall(JDBC will require ports: 449, 8470, 8471, and 8476)

    What TCP ports are used by ODBC to connect to the DB2/400?  8471/9471 http://search400.techtarget.co ...

  9. luogu 3698 [CQOI2017]小Q的棋盘 树形dp

    Code: #include <bits/stdc++.h> #define N 107 #define setIO(s) freopen(s".in","r ...

  10. Bzoj 1798: [Ahoi2009]Seq 维护序列seq(线段树区间操作)

    1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MB Description 老师交给小可可一个维护数列的任务,现在小可 ...