JAVA做音视频解析(MP4)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
JAVA做音视频解析(MP4).
2011-01-17 15:12:25| 分类:计算机编程JAVA,C | 标签:kbits fl byte f_size syncword |字号大中小订阅
java用来做音视频解析的还是挺少的,刚巧领导给分派了这个工作,就硬着头皮干了4个月。基本上算能解决mp4的音视频解析了。share一下,希望能对有这方面需求的人提供帮助,也希望能有更好的建议和解决方案。
此文不涉及RTP,RTCP协议,H264解码,因为本人的专业知识实在有限,不过我还是特别希望有此方面开发经验的兄弟指点一二(c/c++ 方向的也可以)
Lib:这里用到了jave(一个日本的framework封装了ffmpeg),spring2.5.6,依赖于jdk1.6和ffmpeg SDK3.2。MP4利用ffmpeg分割为aac和h264文件分别解析,可将如下代码封装到ng.ProcessBuilder,多线程调用进行MP4分离。
Java代码
ffmpeg.exe -i **.mp4 **.h264 -vstats_file **.log
ffmpeg.exe -i **.mp4 **.aac
ffmpeg.exe -i **.mp4 **.h264 -vstats_file **.log
ffmpeg.exe -i **.mp4 **.aac
特别说明下,分离**.h264文件后面跟了一个-vstats_file **.log ,这是视频分隔输出流日志,后面解析h264文件时要用到的,目前这个日志只试用于win主机,*nix经测试打印日志不全,暂时没找到好的解决方法.
一aac格式文件的解析:
aac文件格式很简单,header(7个字节)-content-header-content...,其中header分为fixed和variable两种,这里采用标准音频(援引标准文档):
Java代码
adts_fixed_header()
{
syncword; 12 bslbf
ID; 1 bslbf
layer; 2 uimsbf
protection_absent; 1 bslbf
profile; 2 uimsbf
sampling_frequency_index; 4 uimsbf
private_bit; 1 bslbf
channel_configuration; 3 uimsbf
original/copy; 1 bslbf
home; 1 bslbf
}
adts_variable_header()
{
copyright_identification_bit; 1 bslbf
copyright_identification_start; 1 bslbf
frame_length; 13 bslbf
adts_buffer_fullness; 11 bslbf
number_of_raw_data_blocks_in_frame; 2 uimsfb
}
adts_fixed_header()
{
syncword; 12 bslbf
ID; 1 bslbf
layer; 2 uimsbf
protection_absent; 1 bslbf
profile; 2 uimsbf
sampling_frequency_index; 4 uimsbf
private_bit; 1 bslbf
channel_configuration; 3 uimsbf
original/copy; 1 bslbf
home; 1 bslbf
}
adts_variable_header()
{
copyright_identification_bit; 1 bslbf
copyright_identification_start; 1 bslbf
frame_length; 13 bslbf
adts_buffer_fullness; 11 bslbf
number_of_raw_data_blocks_in_frame; 2 uimsfb
}
可以看到,两部分各28比特位,共56比特位,7字节.
首两个字节一般都是1111 1111 1111 0001,如果音频数据包含crc校验信息,最后一位就是0(看文档是这样的,但没有实作).
对应关系如下:
syncword 1111 1111 1111
ID 0
layer 00
protection_absent 1
然后接下来的一个半字节,
如下:
profile 两位,见下表
sampling_frequency_index 四位,见下表
private_bit 0
channel_configuration 三位,见下表,立体声为2,即010
original_copy 0
home 0
这部分标志位需要解释一下,援引标准文档
profile
Table 31 – Profiles
0 Main profile
1 Low Complexity profile (LC)
2 Scalable Sampling Rate profile (SSR)
3 (reserved)
再看Variable部分
前两位,一般都是00
copyright_identification_bit 0
copyright_identification_start 0
数值,等于数据包大小加上7--header的大小.其实就是第二个adts chunck的起始地址. frame_length 00 0001 1000 000
全是1,即0x7FF
adts_buffer_fullness 1 1111 1111 11
一般为00
number_of_raw_data_blocks_in_frame 00
比特位映像:
Java代码
1111
1111
1111
0 00 1
xx xx-
xx 0 x-
x x 0 0
0 0 xx-
xxxx
xxxx
xxx 1-
1111
1111-
11 00
1111
1111
1111
0 00 1
xx xx-
xx 0 x-
x x 0 0
0 0 xx-
xxxx
xxxx