ffmpeg实战教程(十二)为视频添加/更换背景音乐

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,
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值