功能简介
ffmpeg 音视频转换工具,需要独立安装;这里使用ws.schild(ffmpeg)java的工具进行对视频的封面截图;主要就是方便随项目直接打包部署也不用添加任何配置操作。
silk音频文件转mp3,我接触到是 微信 相关集成开发的时候用到,这里也记录下方便大家拿走直接用。
Dome简介
- FFmpegUtil封装的一个帮助类,处理视频的截图、音频的转换等。
- silk-v3-decoder文件夹是silk音频文件转mp3的工具;这里帮助类里面是取项目路径,所以jar部署的时候将silk-v3-decoder文件夹和jar放在同级目录就可以了。
助力划水 源码( 腾讯 工蜂):
搬砖程序的痛苦莫过于搜索到了方法居然只有代码片段,一堆大道理底层代码说明;然后根据代码片段写出的代码居然缺少各种引用,然后无从下手,最终代码跑不通。需求、功能、问题还是没得到解决。
pom .xml添加ws.schild引用
<!-- 视频解析模块 -->
<dependency>
<groupId>ws.schild</groupId>
<artifactId>jave-all-deps</artifactId>
<version>3.3.1</version>
</dependency>
FFmpegUtil帮助类相关方法
- 视频截取封面图
/**
* 截取视频中某一帧作为图片
*
* @param videoPath 视频文件路径
* @param imagePath 音频文件路径
* @return
*/ public static boolean getVideoProcessImage(String videoPath, String imagePath) {
File videoSource = new File(videoPath);
File imageTarget = new File(imagePath);
MultimediaObject object = new MultimediaObject(videoSource);
try {
MultimediaInfo multimediaInfo = object.getInfo();
VideoInfo videoInfo = multimediaInfo.getVideo();
Map<String, String> metadata = videoInfo.getMetadata();
String rotate = metadata.getOrDefault("rotate", "");
VideoSize vs = videoInfo.getSize();
// if (rotate) {
// vs = new VideoSize(videoInfo.getSize().getHeight(), videoInfo.getSize().getWidth());
// }
VideoAttributes video = new VideoAttributes();
video.setCodec("png");
video.setSize(vs);
EncodingAttributes attrs = new EncodingAttributes();
//VideoAttributes attrs = ecodeAttrs.getVideoAttributes().get();
attrs.setOutputFormat("image2");
attrs.setDuration(0.01f);//设置转码持续时间(1秒)
attrs.setVideoAttributes(video);
Encoder encoder = new Encoder();
encoder.encode(object, imageTarget, attrs);
// C:UsersADMINI~1AppDataLocalTempjaveffmpeg-amd64-3.2.0.exe -i
// E:Download111.mp4 -t 0.01 -vcodec png -s 1440x720 -movflags faststart -an -f image2 -y
// E:Download111.png -hide_banner
return true;
} catch ( Exception e) {
e.printStackTrace();
return false;
}
}
- silk音频格式转mp3
/**
* silk文件转mp3文件
*
* @param silkPath silk文件
* @param pcmPath 解码为pcm文件
* @param mp3Path mp3文件
* @return
*/public static boolean silk2mp3(String silkPath, String pcmPath, String mp3Path) {
boolean bl = silk2Pcm(silkPath, pcmPath);
if (bl) {
return pcm2Mp3(pcmPath, mp3Path);
} else {
return false;
}
}
/**
* 解码为pcm格式
*/public static boolean silk2Pcm(String silkPath, String pcmPath) {
Process process = null;
try {
String silkv3Path = "";
String command = "";
if (FileUtil.isWindows()) {
silkv3Path = getProPath() + File.separator + "silk-v3-decoder" + File.separator + "windows" + File.separator + "silk_v3_decoder.exe";
command = "cmd.exe /c " + silkv3Path + " " + silkPath + " " + pcmPath + " -quiet";
} else {
silkv3Path = getProPath() + File.separator + "silk-v3-decoder" + File.separator + "converter.sh";
command = "sh " + silkv3Path + " " + silkPath + " " + pcmPath;
}
process = RuntimeUtil.exec(command);
int i = process.waitFor();
return i == 0;
} catch (Exception e) {
log.error("silk2Pcm异常:" + e.getMessage(), e);
return false;
} finally {
RuntimeUtil.destroy(process);
}
}
/**
* pcm为MP3格式
*/public static boolean pcm2Mp3(String pcm, String mp3) {
Process process = null;
try {
DefaultFFMPEGLocator ffmpeg = new DefaultFFMPEGLocator();
String command = "";
if (FileUtil.isWindows()) {
command = "cmd.exe /c " + ffmpeg.getExecutablePath() + " -y -f s16le -ar 24000 -ac 1 -i " + pcm + " " + mp3;
} else {
command = ffmpeg.getExecutablePath() + " -y -f s16le -ar 24000 -ac 1 -i " + pcm + " " + mp3;
}
process = RuntimeUtil.exec(command);
int i = process.waitFor();
return i == 0;
} catch (Exception e) {
log.error("pcm2Mp3异常:" + e.getMessage(), e);
return false;
} finally {
RuntimeUtil.destroy(process);
}
}
public static String getProPath() throws FileNotFoundException {
File path = new File(ResourceUtils.getURL("classpath:").getPath());
if (!path. exists ()) {
path = new File("");
}
return path.getAbsolutePath();
}
测试方法
Swagger访问网址:
- 视频文件上传操作截取封面图
- silk音频文件上传转mp3文件
结语
文章中我只截出了关键性的代码方法,相信对需要的人提供帮助或参考。
助力划水 源码(腾讯工蜂):
希望需要的程序员可以直接使用CTRL + V、CTRL + C就能实现你的需求那是我写这篇文章最大的成就。