java多媒体文件编码、处理工具类
2024-10-06 19:03:00
<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);
}
最新文章
- apache2 tomcat https配置-被忽悠进了CentOS 6
- 【百度SEO优化】如何让蜘蛛爬行你的网站
- C#中gridView常用属性和技巧介绍
- 浅谈PHP神盾的解密过程
- git问题 next fetch will store in remotes/origin
- grub2手动引导ubuntu
- web.xml 的加载顺序
- Swift - 使用xib添加新界面
- sql操作一般函数
- __new__、__init__、__call__三个特殊方法
- selinux学习
- python开发之路:python数据类型(老王版)
- es6数组
- 【模板】多项式乘法(FFT)
- PyCharm 常用习惯设置
- C#程序如何捕捉未try/catch的异常——不弹“XXX已停止工作”报错框
- Office办公 Winrar如何批量把每个文件夹分别压缩成不同的压缩包
- 解决 SQL Server 所有帐号无 sysadmin 权限,且未启用 SQL Server 身份验证,sa 帐号也未启用的问题
- Kettle有什么功能
- 教你使用markdown画程序流程图
热门文章
- CodeForces - 1221E Game With String 分类讨论
- 平衡树treap 0基础详解
- 【线段树 矩阵乘法dp】8.rseq
- docker: Error response from daemon: invalid mount config for type ";bind";: bind source path does not exist: /tmp/tfserving/
- Maven打Dubbo可执行Jar
- SQL拼串--小问题大毛病
- ios的uc浏览器图片加载不出来原因
- 09 深科技相关表结构 (未完成)、git
- Spring中,请求参数处理
- MacOS使用zsh &; oh-my-zsh