Maven依赖,可能需要补充FFMPEG依赖 4.3.2-1.5.5
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv</artifactId>
<version>1.5.5</version>
</dependency>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv-platform</artifactId>
<version>1.5.5</version>
</dependency>
Main测试
public static void main(String[] args) throws Exception {
File file = new File("D:\\Download\\Videodatabytime.mp4"); // 创建File对象,指向本地视频文件
FileInputStream fileInputStream = new FileInputStream(file); // 创建FileInputStream对象,读取本地视频文件
long fileSize = file.length(); // 获取视频文件大小
byte[] buffer = new byte[(int) fileSize]; // 创建byte数组,用于存储视频文件数据
int bytesRead = fileInputStream.read(buffer); // 读取视频文件数据到byte数组中
if (bytesRead == fileSize) { // 如果读取的数据大小等于视频文件大小
convertToMp4(buffer,"D:\\Download\\Video.mp4"); // 调用方法将H264字节流转换为MP4文件
}
}
转流实现
/**
* 将H264字节流转换为MP4文件
* @param bytes H264字节流
* @param outputFileName 输出文件路径及名称
* @throws Exception
*/
public static void convertToMp4(byte[] bytes, String outputFileName) throws Exception {
// 创建FrameGrabber并设置参数
FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(new ByteArrayInputStream(bytes)); // 创建FFmpegFrameGrabber对象,指定输入流为字节流
grabber.setFrameRate(25); // 设置帧率为25
grabber.setVideoCodec(avcodec.AV_CODEC_ID_H264); // 设置输入的视频编码格式为h264
grabber.setPixelFormat(avutil.AV_PIX_FMT_YUV420P); // 设置输入的像素格式为YUV420P
grabber.setSampleRate(44100); //设置音频采样率
grabber.setAudioCodec(avcodec.AV_CODEC_ID_AAC); //设置音频编码器
grabber.start(); // 开始读取视频流
// 创建FrameRecorder并设置参数
FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(outputFileName, grabber.getImageWidth(), grabber.getImageHeight()); //创建FFmpegFrameRecorder对象,指定输出文件路径、宽度、高度
recorder.setFormat("mp4"); // 设置输出文件格式为mp4
recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264); // 设置输出的视频编码格式为h264
recorder.setVideoQuality(28); // 设置视频质量
recorder.setVideoBitrate(2000000); // 设置视频比特率
recorder.setFrameRate(25); // 设置视频帧率
recorder.setSampleRate(44100); // 设置音频采样率
recorder.setAudioChannels(2); // 设置音频频道数
recorder.setAudioCodec(avcodec.AV_CODEC_ID_AAC); // 设置音频编码器
recorder.setPixelFormat(avutil.AV_PIX_FMT_YUV420P); // 设置输出的像素格式为YUV420P
recorder.setVideoOption("preset", "slow"); // 设置视频编码速度
recorder.setVideoOption("tune", "zerolatency"); // 设置编码延迟
recorder.setVideoOption("profile", "high"); // 设置输出的视频质量级别
recorder.setVideoOption("level", "3.1"); // 设置输出的视频级别
recorder.setOption("movflags", "faststart"); //设置输出MP4文件为Web优化模式
recorder.start(); // 开始录制视频
// 从FrameGrabber中读取Frame并写入FrameRecorder中进行编码
Frame frame;
while ((frame = grabber.grab()) != null) {
recorder.record(frame); // 将读取到的Frame写入到FrameRecorder中进行编码
}
// 关闭FrameGrabber和FrameRecorder对象
grabber.stop();
grabber.release();
recorder.stop();
recorder.release();
}