|
发表于 2005-7-27
|
|阅读模式
音频混音能实现什么: Z3 n( z: A1 d$ O- r* Z7 w
提取一个视频文件的音频轨道,和另一个事先准备好的 mp3 文件混音
0 J* z1 d, g" f6 Z6 J' l场景类似于视频剪辑软件的混音操作,将原视频文件和配乐混音,生成新的音频
7 ~* t( F" Y" }) a7 C" h& 0xff 的意义: n- H0 x: P( W0 M/ a
7 i8 j! }& i& W5 m# j& 与运算,只有两者相同时,该位与的结果才为 1 a0 J# B2 F `- H8 W
0x 表示 16 进制,0xff 的二进制表示为 1111 1111/ D& R1 Y) j( c0 x- a+ x
& 0xff 刚好是取当前字节的数值转为二进制,通常搭配移位运算一同服用
4 C7 q" j/ l4 ]$ W K! z
# f% S8 o; i1 A混音是怎么实现的. x8 p# g) p3 u& a5 a
# |% j( t! A" v% [3 o# |/ o
获取两个待混音的文件, a# J2 [$ |# c. l
使用 MediaExtractor 提取音频轨道
8 u/ p5 A- w( u% s0 C% x' w, m使用 MediaCodec 解码成 PCM 裸数据9 ?% E7 n9 _: |+ d3 t
对 PCM 的字节数据进行相加. K0 f0 P5 p' |
生成新的音频文件9 B, |+ f* x b/ q+ R9 t2 l& ^9 Z
) Q7 g Y$ ?+ p: ?& A V5 s混音是基于 PCM 的基础上,在封装格式的文件无法直接进行音频剪辑、混音等操作8 s: k" U# E, S( t- E% W0 S
使用三个字节数组作为数据暂存区,分别对应着素材1,素材2和待合成的文件,这里又涉及到了不同声道数,量化位数的素材音频混音的兼容问题,需要重采样
6 V/ E' B& F4 G& M取素材 1 和素材 2 对应的 pcm 数据进行相加,需要考虑到两个 short 类型的数相加后可能会超过 short 的范围,遇到这种情况时我们直接取 short 的边界8 H x; y# ~3 J7 k
调整素材音频的音量大小时,可能会遇到丢失精度的问题$ [! j1 `7 M) G) m$ m& M* L- `
获取音频轨道后,怎样将数据送去解码+ X& ?' p$ [' R) W2 Z
我们使用 MediaExtractor 获取轨道所在的位置后,通过遍历获取到指定的轨道,然后通过 MediaExtractor.readSampleData() 将轨道数据放到 Buffer 中,此时就需要 MediaCodec 解码了,当拿到空闲的 ByteBuffer 后,将 Buffer 中的数据放到 输入缓冲区中,然后 MediaExtractor 释放上一帧的压缩数据( MediaExtractor.advance() )9 S6 m7 p/ p, D* }+ v) d
重采样
. F; J \( s( X5 {2 i. U8 F$ `& n" U9 h( J6 K, d7 ^. I
什么是重采样:改变音频文件原本的采样率的过程叫做重采样
& R9 z1 V" Y- C$ X; d( jAndroid 中什么时候需要音频重采样
/ X* h' o1 t$ N8 K7 }+ g; P! y4 k, G; i( K0 j- l3 |" }; m
在几个不同采样率的音频文件时,一次只能设置一个采样率,需要统一个值,并且可能不让其他音频失真7 B8 X# ]' y' i N
|
|