2017年,各种关于视频处理的功能层出不穷,现在基本上大多APP都有视频上传播放功能。
然而上传,播放可用的优秀框架有很多,我们在此就不说了。
本篇我们就做一个用ffmpeg给视频添加/更换背景音乐的功能
UI界面有两个输入框,第一个填入要加背景音乐的视频文件,第一个要添加音乐的文件。
然后点击按钮。
可见在手机根目录生成了一个合成的视频文件。试播一下,发现已经有了背景音乐。
其实现原理主要是剥开视频文件拿到视频裸流,然后拿到音频文件根据时间戳一帧一帧的封装成一个新的视频文件
下面是具体实现的代码逻辑。
首先项目中导入编译好的ffmpeg库,然后书写CMakeLists.txt链接这些库
然后编写界面,书写界面的逻辑。
主要代码如下:
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.button:
startDecode();
break;
default:
break;
}
}
private void startDecode() {
String folderurl= Environment.getExternalStorageDirectory().getPath();
String videoUrl=folderurl+"/"+editText1.getText().toString();
String musicUrl=folderurl+"/"+editText2.getText().toString();
Log.e("ws-----------videoUrl",videoUrl);
Log.e("ws------------musicUrl",musicUrl);
addBgMusci(videoUrl,musicUrl);
}
public native int addBgMusci(String videoUrl, String musicUrl);
最后调用ffmpeg API实现native 方法addBgMusci。
JNI源码如下:
#include <jni.h>
#include <string>
extern "C"
{
#include <libavutil/log.h>
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <android/log.h>
#define LOGE(format, ...) __android_log_print(ANDROID_LOG_ERROR, "(>_<)", format, ##__VA_ARGS__)
#define LOGI(format, ...) __android_log_print(ANDROID_LOG_INFO, "(^_^)", format, ##__VA_ARGS__)
//Output FFmpeg's av_log()
void custom_log(void *ptr, int level, const char* fmt, va_list vl){
FILE *fp=fopen("/storage/emulated/0/av_log.txt","a+");
if(fp){
vfprintf(fp,fmt,vl);
fflush(fp);
fclose(fp);
}
}
JNIEXPORT jint JNICALL
Java_com_ws_ffmpegandroidaddmusic_MainActivity_addBgMusci(
JNIEnv *env,