ws.schild 视频格式转换工具使用心得
前言
ws.schild是基于ffmpeg的java工具包,是目前主流的对视频和音频进行转码、裁剪以及提取操作的java工具包。
一、主要工具类简介
1. VideoAttributes
VideoAttributes是ws.schild工具包中对视频属性设置的重要工具类,是ws.schild实现对视频操作的重中之重,同时也是应用最多的一个类。
使用心得:(下文中video为该类的实例化对象)
1.video的Quality(视频质量)属性对转码后视频的大小有很大的影响,并且对转码的时间也有一定的影响,主要影响视频质量,参数类型是整形,数值越小表示质量越高。
2.video的size(视频尺寸)属性对转码后视频的大小有较大的影响,并且对转码的时间也有一定的影响,参数类型是VideoSize。
3.video的BitRate(比特率)属性对转码视频的大小和时间都影响较大,主要影响视频的流畅程度,一般设置的需要大一些,如100k(针对已测试过的视频,不敢保证普遍性)。
4.video的Codec(编解码器)属性一般设置为mpeg4或者h264。
5.video的FrameRate(帧率)属性不要设置的太低,一般设置为15及以上,如果设置太小视频会不流畅。
(上述属性对于不同视频可能有不同影响,具体需要自己多测试~~)
2. AudioAttributes
AudioAttributes是ws.schild工具包中对音频属性设置的重要工具类。
二、使用步骤
1. 导入ws.schild的jar包
首先利用maven建立工程,在pom文件中导入第三方jar包:
<dependency>
<groupId>ws.schild</groupId>
<artifactId>jave-all-deps</artifactId>
<version>3.0.1</version>
</dependency>
2. 实现视频的转码
将视频转码为H.264编码(包括音频转码):
/**
* 视频转码
* @param videoSource
* @param videoTarget
* @return true or false
*/
public static boolean videoToVideo(String videoSource, String videoTarget) {
// Date time = new Date();
// SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-mm-dd hh:mm:ss");
// System.out.println(simpleDateFormat.format(time));
long start = System.currentTimeMillis();
File source = new File(videoSource);
File target = new File(videoTarget);
AudioAttributes audio = new AudioAttributes();
audio.setCodec("aac");
audio.setBitRate(236000 / 2);
audio.setChannels(2);
audio.setSamplingRate(8000);
VideoAttributes video = new VideoAttributes();
video.setCodec("h264");
video.setBitRate(1000000);
video.setFrameRate(25);
video.setQuality(4);
// video.setSize(new VideoSize(720, 480));
EncodingAttributes attrs = new EncodingAttributes();
attrs.setOutputFormat("mp4");
attrs.setAudioAttributes(audio);
attrs.setVideoAttributes(video);
Encoder encoder = new Encoder();
try {
encoder.encode(new MultimediaObject(source), target, attrs);
return true;
} catch (Exception e) {
e.printStackTrace();
System.out.println(encoder.getUnhandledMessages());
return false;
}finally {
// time = new Date();
// System.out.println(simpleDateFormat.format(time));
long end = System.currentTimeMillis();
System.out.println("总耗时:"+ (end-start) +"ms");
}
}
3. 实现音频的转码
将音频转码为mp3编码:
/**
* m4r音频格式转换为mp3,audioPath可更换为要转换的音频格式
* @param audioPath
* @param mp3Path
*/
public static void m4rToMp3(String audioPath,String mp3Path){
File source = new File(audioPath);
File target = new File(mp3Path);
AudioAttributes audio = new AudioAttributes();
audio.setCodec("libmp3lame");
audio.setBitRate(128000);
audio.setChannels(2);
audio.setSamplingRate(44100);
EncodingAttributes attrs = new EncodingAttributes();
attrs.setOutputFormat("mp3");
attrs.setAudioAttributes(audio);
Encoder encoder = new Encoder();
try {
encoder.encode(new MultimediaObject(source), target, attrs);
} catch (EncoderException e) {
e.printStackTrace();
}
}
4. 实现视频文件转为音频文件
将视频转为音频:
/**
* 视频文件转音频文件
* @param videoPath
* @param audioPath
* return true or false
*/
public static boolean videoToAudio(String videoPath, String audioPath){
File fileMp4 = new File(videoPath);
File fileMp3 = new File(audioPath);
AudioAttributes audio = new AudioAttributes();
audio.setCodec("libmp3lame");
audio.setBitRate(128000);
audio.setChannels(2);
audio.setSamplingRate(44100);
EncodingAttributes attrs = new EncodingAttributes();
attrs.setOutputFormat("mp3");
attrs.setAudioAttributes(audio);
Encoder encoder = new Encoder();
MultimediaObject mediaObject = new MultimediaObject(fileMp4);
try{
encoder.encode(mediaObject,fileMp3,attrs);
Log.info("File MP4 convertito MP3");
return true;
}catch (Exception e){
Log.error("File non convertito");
Log.error(e.getMessage());
return false;
}
}
总结
ws.schild 工具包可以非常方便的帮助我们实现对视频和音频的转码和裁剪等操作,并且可以通过设置不同参数来满足不同的需求。但是就目前的测试结果而言,不同的编码格式对于参数的敏感度可能不同,具体场景应该具体分析。