视频混音实践

2025-12-31   访问量:0

概览

视频混音是将多个音频轨道与视频轨道结合在一起,创建一个完整视听体验的过程。它可以用于合并不同的音频源,如背景音乐、对话、音效等,以增强视频的质量和吸引力。本文将介绍如何基于 COS Javascript SDK 调用腾讯云数据万象(CI)音视频转码 API 实现从视频 A 中抽离出其音频,并且混入到视频 B 中覆盖原视频音频,从而实现二次创作等需求。

适用场景

短视频二次创作

在视频文件中混入别的音频文件,利用搞怪的配音对视频进行恶搞创作,或将原音频替换为混音后的音频,来实现不同的后期效果。

前提条件

已创建和绑定 CI 存储桶,详情请参见 存储桶操作

已经 开通媒体处理 功能。

上传视频文件 到存储桶中。

操作步骤

步骤一:初始化 COS SDK 并配置相关信息

初始化 COS Javascript SDK 并配置相关信息:

<!--COS SDK-->

<script src="https://cdn.jsdelivr.net/npm/cos-js-sdk-v5/dist/cos-js-sdk-v5.min.js"></script>



// 密钥请在访问管理控制台获取。https://console.cloud.tencent.com/cam/capi

const cos = new COS({

 SecretId: '************************************',

 SecretKey: '**********',

});



// 存储桶配置请在cos控制台获取。https://console.cloud.tencent.com/cos/bucket

// 格式参考:Bucket: 'abc-1250000000', Region: 'ap-shanghai'

const config = {

 // 需要替换成您自己的存储桶信息

 Bucket: "******125********", // 存储桶

 Region: "**-*********", // 存储桶所在地域

 FileName: "demo1.mp4", // 源文件

 MixFileName: "demo2.mp4", // 混音文件

 ResultName: "demo3.mp4", // 混音之后自定义文件名

};

说明:

注意:该初始化方式仅供联调测试使用,为了安全起见,请勿在生产环境直接暴露密钥。

生产环境请参考各语言 SDK 签名实现,详情请参见 SDK 签名实现

步骤二:提交音视频转码任务

提交音视频转码任务,参数详情参见 提交任务接口。接口请求参数格式为:

/**

* 支持使用cos桶文件,如果文件为私有读,需要使用cos.getObjectUrl方法得到一个带有签名信息的url

* 如果为其他在线资源,可忽略此步骤

*/

const AkUrl = await cos.getObjectUrl({

 Bucket: config.Bucket,

 Region: config.Region,

 Key: config.MixFileName,

 Sign: true,

});



const key = `jobs`; // 固定值,必须

const host = `${config.Bucket}.ci.${config.Region}.myqcloud.com`;

const url = `https://${host}/${key}`;

const body = COS.util.json2xml({

 Request: {

   // 创建任务的Tag

   Tag: "Transcode",

   // 待操作的文件信息

   Input: {

     // 源文件路径

     Object: config.FileName,

   },

   // 操作规则

   Operation: {

     // 转码参数

     Transcode: {

       Container: {

         Format: "mp4",

       },

       Video: {

         Codec: "H.264",

       },

       Audio: {

         Codec: "aac",

       },

       // 混音参数

       AudioMix: {

         AudioSource: AkUrl, // 混音文件路径

         Replace: true, // 是否保留被混音视频的源音频

       },

     },

     // 结果输出配置

     Output: {

       // 存储桶的地域

       Region: config.Region,

       // 存储结果的存储桶

       Bucket: config.Bucket,

       // 输出结果的文件名

       Object: config.ResultName,

     },

   },

 },

});



const res = await cos.request({

 Method: "POST", // 固定值

 Key: key, // 固定值

 Url: url, // 请求的url

 Body: body, // 请求体参数

 ContentType: "application/xml", // 固定值

});

说明:

转码计费规则,请参见 音视频转码费用

通过子账号使用时,需要授予相关的权限,详情请参见 授权粒度详情 文档。

接口返回参数请参见响应参数,JobsDetail 节点下为转码任务接口响应信息。其中 JobId 为关键信息,步骤三中查询翻译任务时会用到。

步骤三:查询音视频转码任务执行结果

步骤二中提交任务后返回的 JobId 作为任务唯一标识,通过 JobId 查询翻译任务,参数详情请参见 查询任务接口。 可定时查询任务的状态,当返回的 State 为 Success 时代表文件转码成功,混音之后的视频文件地址为:https://${config.Bucket}.cos.${config.Region}.myqcloud.com/${config.ResultName}

轮询任务执行结果的代码可参考:

// 轮询任务执行结果function queryTranceTrack(jobId) {  setTimeout(() => {    const key = `jobs/${jobId}`; // jobId: 需要查询的jobId;    const host = config.Bucket + ".ci." + config.Region + ".myqcloud.com";    const url = `https://${host}/${key}`;    cos.request(      {        Bucket: config.Bucket,        Region: config.Region,        Method: "GET",        Url: url,        Key: key /** 固定值,必须 */,        ContentType: "application/xml" /** 固定值,必须 */,      },      async (err, data) => {        if (err) {          msgText.innerHTML = "任务查询失败,请在console查看报错信息";          console.log(JSON.stringify(err));          return;        }        const resp = data.Response || {};        //判断任务是否在执行中        if (resp.JobsDetail.State !== "Success") {          msgText.innerHTML = "任务执行中...";          queryTranceTrack(jobId);          return;        }        // 任务执行完成 初始化播放器        msgText.innerHTML = "任务完成";      }    );  }, 2000);}

说明:

推荐使用 API Explorer调试

费用相关

对象存储相关费用

音视频转码费用

Demo 体验

具体代码可参考 cos demo


热门文章
更多>