JAVA做音视频解析(MP4)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

相关文档
最新文档