地址:https://gitee.com/dahai2070/mytx-android 这个是我们的创业项目开源地址,欢迎加入,共谋发展。
目前正在写视频压缩编辑,设置滤镜,添加背景音乐等,写好了以下内容就会同步过期。
就是想要上面这样的波形图,一开始在github 找了一个demo,里面有根据音频的pcm 文件,得出波形数组,然后自定义View 绘制,但是从用户选择背景音量到到pcm 数据提取完成,3分钟多一点的mp3 ,在我手机上是15S以上,太慢了,,,
然后猜想到ffmepg 是否能搞定,网上一搜,果然可以,上面的图片就是我用ffmpeg 绘制出来的png 。
ffmpeg 命令是 :
ffmpeg -i mix_audio_1585037033975.aac -filter_complex "showwavespic=s=1280x120:colors=0xb5b5b6" -frames:v 1 output1.png
放一张手机上的效果图,
下面是java 代码:
生成命令的代码:
* 生成 音频波形PNG图
* ffmpeg -i mix_audio_1585037033975.aac -filter_complex "showwavespic=s=1280x120" -frames:v 1 output1.png
* @param audioPath
* @param output
* @return
*/
public static String[] generateWavePNG(@NonNull String audioPath, @NonNull String output) {
List<String> cmdList = new ArrayList<String>();
cmdList.add("ffmpeg");
cmdList.add("-i");
cmdList.add(audioPath);
cmdList.add("-filter_complex");
cmdList.add("showwavespic=s=1280x120:colors=0xb5b5b6"); //1280 *120 是尺寸 .colors 后面是绘制的颜色
cmdList.add("-frames:v");
cmdList.add("1");
cmdList.add("-y");
cmdList.add(output);
String[] cmds = new String[cmdList.size()];
cmdList.toArray(cmds);
return cmds;
}
生成一个临时文件路径,用来保存生成的png,
String wavePNGPath = PathUtils.getBasePath() + File.separator + "temp_" + System.currentTimeMillis() + ".png";
String[] cmd = CainCommandEditor.generateWavePNG(musicPath, wavePNGPath);
FFmpegCmd.exec(cmd, 20, new FFmpegCmd.OnCmdExecListener() {
@Override
public void onSuccess() {
Log.i(TAG, "onSuccess: 生成波形图完成,,地址是:" + wavePNGPath + "合并所花时间是:" + (System.currentTimeMillis() - start));
if (hasMusic) {
((Activity) context).runOnUiThread(new Runnable() {
@Override
public void run() {
setWaveData(wavePNGPath);
}
});
}
}
@Override
public void onFailure() {
Log.e(TAG, "onFailure: ");
}
@Override
public void onProgress(float progress) {
}
});
FFmpegCmd 是调用ffmpeg 的一个工具类。这个网上很多,过几天也会一并放项目中。
生成成功后,从路径中读取 图片,给到Imageview 显示即可。