|
发表于 2005-7-27
|
|阅读模式
音频混音能实现什么
" l+ q4 Q8 e* O0 I H, |7 N提取一个视频文件的音频轨道,和另一个事先准备好的 mp3 文件混音6 L- m0 q2 ~% u. O
场景类似于视频剪辑软件的混音操作,将原视频文件和配乐混音,生成新的音频+ [) F7 K0 }7 M }( p7 u
& 0xff 的意义" W- L0 l$ t. n& P
G! l1 f6 q& ^& 与运算,只有两者相同时,该位与的结果才为 1* D5 O4 |6 t5 `- d
0x 表示 16 进制,0xff 的二进制表示为 1111 1111
* f$ m% z, ], I* {& 0xff 刚好是取当前字节的数值转为二进制,通常搭配移位运算一同服用
) C# d% C7 i9 N9 p' _, {4 L- O
' Z* x* a: t& w w+ R混音是怎么实现的
6 ?/ x: r2 e5 O: _- Q1 L* N8 t4 K; t; e/ u
获取两个待混音的文件8 s9 U- ?9 s* w/ e1 R6 W
使用 MediaExtractor 提取音频轨道
+ a$ Q; |% b- [使用 MediaCodec 解码成 PCM 裸数据
: T1 l$ h z+ x2 M) E/ c9 Z6 Z对 PCM 的字节数据进行相加
+ Q0 R, _( U/ N) X7 _# S" |生成新的音频文件
* z6 G# K5 T1 e5 u$ h5 ~4 L/ w6 J$ ?- I, b/ x9 x' \
混音是基于 PCM 的基础上,在封装格式的文件无法直接进行音频剪辑、混音等操作* { x$ ?& S) ^& e1 U! |. G8 \: U
使用三个字节数组作为数据暂存区,分别对应着素材1,素材2和待合成的文件,这里又涉及到了不同声道数,量化位数的素材音频混音的兼容问题,需要重采样7 o3 @4 S, c$ k
取素材 1 和素材 2 对应的 pcm 数据进行相加,需要考虑到两个 short 类型的数相加后可能会超过 short 的范围,遇到这种情况时我们直接取 short 的边界
' Z ^1 q- [# ?( v3 s' B调整素材音频的音量大小时,可能会遇到丢失精度的问题
# F( o' C) e4 _6 X( P% h获取音频轨道后,怎样将数据送去解码
' G' `4 N1 P, r( S4 l$ u- n我们使用 MediaExtractor 获取轨道所在的位置后,通过遍历获取到指定的轨道,然后通过 MediaExtractor.readSampleData() 将轨道数据放到 Buffer 中,此时就需要 MediaCodec 解码了,当拿到空闲的 ByteBuffer 后,将 Buffer 中的数据放到 输入缓冲区中,然后 MediaExtractor 释放上一帧的压缩数据( MediaExtractor.advance() )
; e. f& e" a# k& M7 i. j重采样$ } W( d1 A# }* [1 G
; S2 R- Q6 g5 G# I什么是重采样:改变音频文件原本的采样率的过程叫做重采样" u% E, P% f- u/ ?# @6 h
Android 中什么时候需要音频重采样) a- L; v- Q* z$ j& V# I1 C
: ^' `# a: R& H0 m: L- s
在几个不同采样率的音频文件时,一次只能设置一个采样率,需要统一个值,并且可能不让其他音频失真
( T v9 h4 x3 x |
|