|
音频混音能实现什么* `- O7 I# Q" R
提取一个视频文件的音频轨道,和另一个事先准备好的 mp3 文件混音3 |8 ` |7 `2 |4 w( I# C) b9 r/ s1 S
场景类似于视频剪辑软件的混音操作,将原视频文件和配乐混音,生成新的音频
' Y: z( V: h) ?9 G3 Y7 t& 0xff 的意义6 B3 }5 J w+ S5 d# R( R
# T' P, G2 }" r6 U! r) F- r1 y/ B2 C& 与运算,只有两者相同时,该位与的结果才为 13 _2 q: m# F# o
0x 表示 16 进制,0xff 的二进制表示为 1111 1111
8 G. M0 W& N. B+ I: l& 0xff 刚好是取当前字节的数值转为二进制,通常搭配移位运算一同服用& [8 r# R- Z' o/ Y4 x
" ?6 e: L1 D7 M3 Q& L, G* b混音是怎么实现的
# q5 J5 @3 X0 L$ j# d0 y7 W+ A$ j
! B0 }: S+ e- S获取两个待混音的文件
) x$ k' f0 H( B2 b7 o" e使用 MediaExtractor 提取音频轨道
/ |' ]$ l9 y- \+ L. d1 W使用 MediaCodec 解码成 PCM 裸数据3 r: J5 C4 _, f" T4 N6 l: S s' n6 g
对 PCM 的字节数据进行相加1 t7 `+ H; l) \3 y* |
生成新的音频文件; ^/ B; U* c8 i$ d& B
. v, H0 l- k+ }3 P6 L2 I
混音是基于 PCM 的基础上,在封装格式的文件无法直接进行音频剪辑、混音等操作" ~+ m7 q) l6 ]' ?# M
使用三个字节数组作为数据暂存区,分别对应着素材1,素材2和待合成的文件,这里又涉及到了不同声道数,量化位数的素材音频混音的兼容问题,需要重采样
; _" t8 }) l. i6 n* R2 q取素材 1 和素材 2 对应的 pcm 数据进行相加,需要考虑到两个 short 类型的数相加后可能会超过 short 的范围,遇到这种情况时我们直接取 short 的边界
U& N0 U# w* v: f. @/ v调整素材音频的音量大小时,可能会遇到丢失精度的问题
+ o6 ~0 l0 w0 z& F1 k3 V9 v) r获取音频轨道后,怎样将数据送去解码* Q" {9 I `- ]5 u; o0 P; F
我们使用 MediaExtractor 获取轨道所在的位置后,通过遍历获取到指定的轨道,然后通过 MediaExtractor.readSampleData() 将轨道数据放到 Buffer 中,此时就需要 MediaCodec 解码了,当拿到空闲的 ByteBuffer 后,将 Buffer 中的数据放到 输入缓冲区中,然后 MediaExtractor 释放上一帧的压缩数据( MediaExtractor.advance() )% O/ w9 d: {. R$ K9 t
重采样
: A+ ^- V* J" } {. @9 }6 {7 L. x2 |" F1 ?' d8 H' K/ N9 A
什么是重采样:改变音频文件原本的采样率的过程叫做重采样* c5 W1 P7 F* j
Android 中什么时候需要音频重采样1 X( K' Q( D) E' W) S: }; B+ w" ~
- R, M; r* J4 q+ p! a
在几个不同采样率的音频文件时,一次只能设置一个采样率,需要统一个值,并且可能不让其他音频失真4 x$ l7 F2 L9 W
|
|