JavaCV實現(xiàn)多個MP4視頻的合并
使用javacv和ffmpeg框架簡單快速的合并mp4文件的視頻和音頻
1.依賴
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv</artifactId>
<version>1.5.1</version>
</dependency>
<!-- 視頻處理包 -->
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>ffmpeg-platform</artifactId>
<version>4.1.3-1.5.1</version>
</dependency>
2.測試類
可以根據(jù)自己的需要進(jìn)行封裝
package com.test.demo;
import org.bytedeco.ffmpeg.global.avcodec;
import org.bytedeco.ffmpeg.global.avutil;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.FFmpegFrameRecorder;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.FrameGrabber;
import org.bytedeco.javacv.FrameRecorder;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.ArrayList;
import java.util.List;
import static org.bytedeco.ffmpeg.global.avutil.AV_LOG_ERROR;
@SpringBootTest
public class MP4Test {
public static void main(String[] args) throws FrameRecorder.Exception, FrameGrabber.Exception {
List<String> file = new ArrayList<>();
// 添加需要合并的mp4文件
file.add("C:\Users\Administrator\Desktop\1\source\1.mp4");
file.add("C:\Users\Administrator\Desktop\1\source\2.mp4");
long start = System.currentTimeMillis();
// 合并
videoMerge(file, "C:\Users\Administrator\Desktop\1\1\5.mp4");
// 統(tǒng)計耗時
System.out.println("耗時" + (System.currentTimeMillis() - start) + "毫秒");
}
/**
* 多個視頻的合并
*
* @param videoList 地址集合
* @param output 合并后的視頻輸出地址
*/
public static void videoMerge(List<String> videoList, String output) throws FrameRecorder.Exception, FrameGrabber.Exception {
// 幀抓取器 以第一個視頻為藍(lán)本開始抓取
FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(videoList.get(0));
// 載入
grabber.start();
// 配置幀解碼器
FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(output, grabber.getImageWidth(),
grabber.getImageHeight(), 0);
// 視頻編解碼器
recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);
recorder.setAudioCodec(avcodec.AV_CODEC_ID_AAC); // 設(shè)置音頻編解碼器
// 單通道
recorder.setAudioChannels(1);
recorder.setInterleaved(true);
// 輸出流封裝格式
recorder.setFormat("mp4");
// 視頻幀率
recorder.setFrameRate(grabber.getFrameRate());
// 設(shè)置日志輸出(error)
avutil.av_log_set_level(AV_LOG_ERROR);
// 設(shè)置分辨率格式 yuv420p
recorder.setPixelFormat(avutil.AV_PIX_FMT_YUV420P);
// 設(shè)置視頻比特率
recorder.setVideoBitrate(grabber.getVideoBitrate());
// 音頻比特率
recorder.setAudioBitrate(grabber.getAudioBitrate()); // 設(shè)置音頻比特率
// 開始編碼
recorder.start();
// 循環(huán)設(shè)置
for (String videoPath : videoList) {
try (FFmpegFrameGrabber grabberTemp = new FFmpegFrameGrabber(videoPath)) {
grabberTemp.start();
//設(shè)置幀
Frame frame;
while ((frame = grabberTemp.grabFrame()) != null) {
recorder.record(frame);
}
// 處理音頻幀
Frame audioFrame;
while ((audioFrame = grabberTemp.grabSamples()) != null) {
recorder.record(audioFrame);
}
} catch (FrameGrabber.Exception e) {
System.err.println("Error grabbing frames from video: " + videoPath);
e.printStackTrace();
}
}
// 關(guān)閉幀編解碼器
recorder.close();
grabber.close();
}
}
到此這篇關(guān)于JavaCV實現(xiàn)多個MP4視頻的合并的文章就介紹到這了,更多相關(guān)JavaCV視頻合并內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
spring @EventListener 事件與監(jiān)聽的示例詳解
本文介紹了自定義Spring事件和監(jiān)聽器的方法,包括如何發(fā)布事件、監(jiān)聽事件以及如何處理異步事件,通過示例代碼和日志,展示了事件的順序執(zhí)行和異步處理機制,感興趣的朋友一起看看吧2025-03-03
SpringBoot中@RestControllerAdvice @ExceptionHandler異常統(tǒng)一處
這篇文章主要介紹了SpringBoot中@RestControllerAdvice @ExceptionHandler異常統(tǒng)一處理類失效原因,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01
java將數(shù)據(jù)寫入內(nèi)存,磁盤的方法
下面小編就為大家分享一篇java將數(shù)據(jù)寫入內(nèi)存,磁盤的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-01-01
Java Swing實現(xiàn)自定義可搜索下拉框(附完整代碼)
Swing 原生的?JComboBox?雖然支持下拉選擇,但有明顯的缺點,本文將通過Java Swing實現(xiàn)自定義可搜索下拉框CusComboBox,有需要的小伙伴可以了解下2026-06-06
Java8中對泛型目標(biāo)類型推斷方法的改進(jìn)
這篇文章主要介紹了Java8中對泛型目標(biāo)類型推斷方法的改進(jìn),需要的朋友可以參考下2014-06-06

