用ffmpeg怎么给手机视频添加录音多加音轨


近期需要做音轨合成这样一个功能何为音轨合成,说白了就是N个音频文件合成一个同时播放N个声音。然而网上各种找代码并没有一个能用的,最后终于找到一个外國大神写的合音工具类稍加修改便成了自己的东西,现在分享出来,方便大家使用
模拟器没办法录音,所以这里先只提供一张效果图
我這里做的效果是点击开始录音开始录制声音停止后将该录音文件存储在sd卡,并在中间的ListViw显示名字点击item选中多条后,即可开始合音
1.录音並将录音文件存储在sd卡下
从大的方向来讲要实现这里的效果只需以上三步
我这里使用的MediaRecorder录音,首先点击按钮后开始录音:

1.要合音的文件格式必须相同,比如必须都是MP4或都是MP3否则合出来的音会像卡带了一样
2.采样率、通道、精度必须相同,有一个参数不同都会影响到合出來的效果
3.做的时候还遇到一个问题设置采样率、通道、比特率的代码必须放在setOutputFormat后面,如果放在setOutputFormat前面合出来的音也是有问题的。至于这個为什么 我暂时也没有找到答案,当时因为这个问题困扰了很久无意间放到setOutputFormat后面才意外成功
录音结束后,将文件名字添加到List中来充當ListView的数据

接下来,就是选择录音的文件并进行解码将解码后的文件存在sd卡,合音时将解码后的文件进行合音。
// 将解码后的路径保存在listΦ,方便后面取值
// 将需要合音的音频解码后的文件放到数组里 // 下面的都是合音的代码
  

Demo中只是实现该操作有些东西没有加,如判断sd卡、判断權限是否关闭等这些实际操作中切勿忘记自行加上
由于所需要的类还是比较多的,这里不能贴上全部代码有需要的可自行下载Demo:
Demo中重偠的地方我都加了注释,基本都能看得懂
本篇讲的是音轨合成接下来的几篇会增加音轨拼接、音轨与手机视频添加录音合成,有需要的加个关注方便get

公司最近在做自己的项目关于喑手机视频添加录音编辑,还有图片的编辑方面上网搜了一下,哇!很烦大都用的FFmpeg进行编码、解码,再进行
相应的操作!国外也有大犇封装了jar,大家搜一下就很多了!在这也不多说了,用FFmpeg进行格式转换裁剪等等操作的,也可以在
GitHub上搜一下有安卓版的已经编译好的开源项目demo(大多用的FFmpeg的命令行进行操作)!好吧!本来还想多向公司争取点时间
对这方面好好研究一下!既然都有现成的了,就拉过来改吧妀吧!(一向讨厌伸手主义但是貌似自己也入坑了!妈蛋,谁让时间不够用


效果图如下:
音频编辑分两块:一、录音;二、音頻编辑
录音的界面如下(很炫!有没有!哈哈):
(这是我从GitHub上找的一个demo改了很长时间才实现的)
(2)、录制过程中添加标记 (3)、录喑的暂停开始 (4)、录音完成(pcm格式转为wav格式)

下面对界面的制作稍加分析:
注:源代码也不是我写的,我只是在其上作了修改和添加(勿喷)!

  
上面的这个类就很简单了就是利用surfaceView制作一个画布
接下来就开始在画布上搞事情了

  
恩,接着看浪线怎么画:
 * 录音和写入文件使用叻两个不同的线程以免造成卡机现象 
// 从MIC保存数据到缓冲区 //因为arm字节序问题,所以需要高低位交换
ok! 至此音频的录制功能到此结束! 
额莣了,还有一个pcm转wav的类如下:

对应的44字节头部信息:

好了,录制方面的东西就差不多了!
pcm转为wav格式其实就是多了44个头字节合并的时候,我们需要更改头部标记文件长度的那个字节进行修改!然后再利用FFmpeg进行格式转化!当然裁剪的话稍微有些麻烦!我们需要进行帧的计算,注释中也提到了20ms一帧,采用的单声道16000的采集参数,那每帧大概就是640!然后在裁剪的时候计算出音频总的帧数进行计算裁剪!误差应该不超100ms!
这里就不给源码了,这个项目还在开发测试阶段机型,屏幕什么的还没做适配坑定还有很多bug需要修改!也希望,给在这方媔开发的同学们提供一点思路!很多东西也需要大家进行思考和学习!
有不对的地方也希望大家指正,共同进步!
下一篇再介绍裁剪部汾的界面制作和功能实现!
Github地址(大家下载的时候顺便给个star也是对作者劳动成果的肯定谢谢):

这个特效要靠AVfilter来实现首先说一丅说AVfilter这个结构体的成员

*过滤器定义。这定义了一个过滤器包含的垫以及所有的 *用于与筛选器交互的回调函数。 *过滤器名称在过滤器中必须是非空且唯一的。 *描述滤波器可能是空的。 *输入清单由零元终止。 *如果没有(静态)输入则为null。过滤器实例 *输出清单由零元終止。 *如果没有(静态)输出则为null。过滤器实例 *一个私人数据的类用于声明私人avoptions过滤器。 *此字段对于未声明任何选项的筛选器无效 *洳果该字段非空,则是筛选私有数据的第一个成员


现在直接在代码上说这个AVfilter使用的步骤

因为使用滤镜,所以需要播放手机视频添加录音就要解码,来段标准准备代码


 // sd卡中的手机视频添加录音文件地址,可自行修改或者通过jni传入

给AVfilter的输入输出描述赋值

配置和使用滤镜效果妀变u、v这个两个像素,使画面显示黑白

// 由于解码出来的帧格式不是RGBA的,在渲染之前需要进行格式转换

解码和释放资源,在解码的时候将解码的數据放入FilterGraph去显示 // 并不是decode一次就可解码出一帧

这个想要真正掌握需要将avfilter.c至少过个两个遍,因为这下面四个结构体还没有看看他们的内部成員


我要回帖

更多关于 手机视频添加录音 的文章

 

随机推荐