java多媒體文件編碼 處理工具類代碼實例
這篇文章主要介紹了java多媒體文件編碼 處理工具類使用解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
引入
<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>
代碼
/*** *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); }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
MyBatis測試報錯:Cannot?determine?value?type?from?string?&a
這篇文章主要給大家介紹了關(guān)于MyBatis測試報錯:Cannot?determine?value?type?from?string?'xxx'的解決辦法,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02org.apache.ibatis.annotations不存在的問題
這篇文章主要介紹了org.apache.ibatis.annotations不存在的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10使用OpenFeign實現(xiàn)服務(wù)調(diào)用的方法詳解
OpenFeign是運行在客戶端的聲明式服務(wù)調(diào)用的框架,通過聲明接口的方式來達(dá)到對服務(wù)的調(diào)用,本文就來和大家講講如何使用OpenFeign實現(xiàn)服務(wù)調(diào)用吧2023-06-06Java日常練習(xí)題,每天進(jìn)步一點點(34)
下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望可以幫到你2021-07-07Mybatis-Plus 條件構(gòu)造器 QueryWrapper 的基本用法
這篇文章主要介紹了Mybatis-Plus - 條件構(gòu)造器 QueryWrapper 的使用,通過實例代碼給大家介紹了查詢示例代碼及實現(xiàn)需求,代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-09-09面試官:java ThreadLocal真的會造成內(nèi)存泄露嗎
ThreadLocal,java面試過程中的“釘子戶”,在網(wǎng)上也充斥著各種有關(guān)ThreadLocal內(nèi)存泄露的問題,本文換個角度,先思考ThreadLocal體系中的ThreadLocalMap為什么要設(shè)計成弱引用2021-08-08