压缩方法
依赖
<dependency>
<groupId>joinery</groupId>
<artifactId>jave</artifactId>
<version>1.0.2</version>
</dependency>
方法
package com.online.ota.util;
import java.io.File;
import it.sauronsoftware.jave.AudioAttributes;
import it.sauronsoftware.jave.Encoder;
import it.sauronsoftware.jave.EncoderException;
import it.sauronsoftware.jave.EncodingAttributes;
import it.sauronsoftware.jave.VideoAttributes;
public class FfmepgUtil {
public static void ffmepg(String sourceAddr, String targetAddr,
String codec, int bitRate, String format) {
File source = new File(sourceAddr);
File target = new File(targetAddr);
try {
AudioAttributes audio = new AudioAttributes();// 音频属性
audio.setCodec("libmp3lame");// libfaac PGM编码
audio.setBitRate(new Integer(128000));// 音频比特率
audio.setChannels(new Integer(2));// 声道
audio.setSamplingRate(new Integer(44100));// 采样率
VideoAttributes video = new VideoAttributes();// 视频属性
video.setCodec(codec);// 视频编码
video.setBitRate(new Integer(bitRate));// 视频比特率
video.setFrameRate(new Integer(30));// 帧率
EncodingAttributes attrs = new EncodingAttributes();// 转码属性
attrs.setFormat(format);// 视频格式
attrs.setAudioAttributes(audio);// 音频属性
attrs.setVideoAttributes(video);// 视频属性
Encoder encoder = new Encoder();// 创建解码器
encoder.encode(source, target, attrs);
System.out.println("上传成功!!!");
} catch (EncoderException e) {
e.printStackTrace();
System.out.println("文件格式不正确!");
}
}
public static void main(String[] args) throws Exception, Exception {
/*for(int i = 0; i<=0;i++) {
ffmepg("D:\\pm.mp4", "D:\\upload\\pm"+i+".mp4", "mpeg4", 15, "mp4");
}*/
ffmepg("D:\\upload\\mu.mp4", "D:\\upload\\server1UP\\pm35.mp4", "mpeg4", 15, "mp4");
TranscodingUtil.frameRecord("D:\\upload\\server1UP\\pm35.mp4", "D:\\upload\\solidityUP\\pm35.mp4");
}
}
转码
依赖
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv</artifactId>
<version>1.4.1</version>
</dependency>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacpp</artifactId>
<version>1.4.1</version>
</dependency>
<dependency>
<groupId>org.bytedeco.javacpp-presets</groupId>
<artifactId>opencv-platform</artifactId>
<version>3.4.1-1.4.1</version>
</dependency>
<dependency>
<groupId>org.bytedeco.javacpp-presets</groupId>
<artifactId>ffmpeg-platform</artifactId>
<version>3.4.2-1.4.1</version>
</dependency>
方法
package cn.com.Utils;
import org.bytedeco.javacpp.avcodec;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.FFmpegFrameRecorder;
import org.bytedeco.javacv.Frame;
public class TranscodingUtil {
private static boolean isStart = true;
public static void frameRecord(String inputFile, String outputFile)
throws Exception, org.bytedeco.javacv.FrameRecorder.Exception {
// 获取视频源
FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(inputFile);
grabber.setOption("rtsp_transport","tcp");
//速度
grabber.setFrameRate(30);
//码率
grabber.setVideoBitrate(3000000);
// 流媒体输出地址,分辨率(长,高),是否录制音频(0:不录制/1:录制)
FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(outputFile, 1280, 720, 1);
recorder.setFrameRate(30);
recorder.setVideoBitrate(3000000);
//编码格式
recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264); //avcodec.AV_CODEC_ID_H264 //AV_CODEC_ID_MPEG4
recordByFrame(grabber, recorder);
}
private static void recordByFrame(FFmpegFrameGrabber grabber, FFmpegFrameRecorder recorder)
throws Exception, org.bytedeco.javacv.FrameRecorder.Exception {
try {// 建议在线程中使用该方法
grabber.start();
recorder.start();
//CanvasFrame canvas = new CanvasFrame("摄像头");//新建一个窗口
// canvas.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//canvas.setAlwaysOnTop(true);
long t1 = System.currentTimeMillis();
Frame frame = null;
while (isStart && (frame = grabber.grabFrame()) != null) {
long t2 = System.currentTimeMillis();
if(t2-t1 > 2*60*60*1000){
break;
}else{
recorder.record(frame);
//TODO your work
}
//canvas.showImage(grabber.grab());//获取摄像头图像并放到窗口上显示, 这里的Frame frame=grabber.grab(); frame是一帧视频图像
}
recorder.stop();
grabber.stop();
} finally {
if (grabber != null) {
grabber.stop();
}
}
}
public static void main(String[] args) {
String inputFile="D:\\upload\\pm12.mp4";
String outputFile="D:\\upload\\solidityUP\\pm12.mp4";
try {
frameRecord(inputFile,outputFile);
} catch (org.bytedeco.javacv.FrameRecorder.Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}