JAVA做音视频解析(MP4)

合集下载

轻松解读音频视频编码及文件格式问题

轻松解读音频视频编码及文件格式问题
? H.26X系列:(由ITU[国际电传视讯联盟]主导,侧重网络传输,注意:只是视频编码)
包括H261、H262、H263、H263+、H263++、H264(就是MPEG4 AVC-合作的结晶)
? 微软windows media系列:(公司牛,能自己定标准啊...)
视频编码有Mpeg-4 v1/v2/v3(基于MPEG4,DIVX3的来源,呵呵)、Windows Media Video 7/8/9/10
? ASF
Windows Media 采用的音频视频容器,能够用于流传送,还能包容脚本等。
? RM
RealMedia 采用的音频视频容器,用于流传送。
注意:RMVB,是视频编码部分采用可变码率压缩的文件格式(容器)
? MOV
QuickTime 的音频视频容器,恐怕也是现今最强大的容器,甚至支持虚拟现实技术,Java 等,它的里只是抛砖引玉,对于基础的、入门性的一些常识做了简单介绍,至于更进
一步的,比如每一种编码的算法、文件格式的规范等等,就需要大家参考相关专业书籍和资料了,当然,也可以
继续关注我的系列文章。
音频编码有Windows Media audeo v1/v2/7/8/9
? Real Media系列:(注意,这里说的Real的编码,可不是rm、rmvb文件,呵呵)
视频编码有RealVideo G2(早期)、RealVideo 8/9/10
音频编码有RealAudio cook/sipro(早期)、RealAudio AAC/AACPlus等
视频编码方面主要是Mpeg1(vcd用的就是它)、Mpeg2(DVD使用)、Mpeg4(现在的DVDRIP使用的都是它的变种,如:divx,xvid等)、Mpeg4 AVC(现在正热门);

java cv 使用流程

java cv 使用流程

JavaCV 使用流程简介JavaCV 是一个基于 OpenCV 和 FFmpeg 的 Java 接口库,提供了许多用于计算机视觉和图像处理的功能。

本文将详细介绍 JavaCV 的使用流程,包括环境配置、安装、导入库、基本用法等。

环境配置在开始使用 JavaCV 之前,需要确保系统已经安装了以下几个软件: - JDK(Java Development Kit):Java 开发环境,用于编译和运行 Java 代码。

- OpenCV:计算机视觉库,提供了图像处理和分析的功能。

- FFmpeg:音视频处理工具,用于处理视频文件。

安装 JavaCV1.下载 JavaCV 安装包:可以从 JavaCV 的官方网站()下载最新的稳定版本。

2.将下载的安装包解压到本地目录。

导入库在使用 JavaCV 之前,需要将相关的库文件导入到项目中。

以下是导入库的步骤:1.在 Eclipse 中创建一个新的 Java 项目。

2.右键点击项目,选择“Build Path” > “Configure Build Path”。

3.在“Libraries” 标签下,点击“Add External JARs”。

4.浏览并选择 JavaCV 安装包中的以下 JAR 文件进行导入:–javacv.jar–javacpp.jar–javacv-platform.jar–slf4j-api.jar–slf4j-nop.jar–ffmpeg.jar–opencv.jar5.点击“Apply and Close” 完成导入。

基本用法图像处理JavaCV 提供了许多用于图像处理的功能,包括读取、显示、保存图像等。

以下是一些常用的图像处理操作:1.读取图像:opencv_core.Mat image = opencv_imgcodecs.imread("path/to/image.jpg");2.显示图像:CanvasFrame canvas = new CanvasFrame("Image");canvas.showImage(toBufferedImage(image));3.保存图像:opencv_imgcodecs.imwrite("path/to/output.jpg", image);视频处理JavaCV 还提供了处理视频的功能,包括读取、显示、保存视频等。

java实现视频上传和播放解读

java实现视频上传和播放解读

Java实现视频网站的视频上传、视频转码、视频关键帧抽图, 及视频播放功能视频网站中提供的在线视频播放功能,播放的都是FLV格式的文件,它是Flash动画文件,可通过Flash制作的播放器来播放该文件.项目中用制作的player.swf播放器.多媒体视频处理工具FFmpeg有非常强大的功能包括视频采集功能、视频格式转换、视频抓图、给视频加水印等。

ffmpeg视频采集功能非常强大,不仅可以采集视频采集卡或USB摄像头的图像,还可以进行屏幕录制,同时还支持以RTP方式将视频流传送给支持RTSP的流媒体服务器,支持直播应用。

1.能支持的格式ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)2.不能支持的格式对ffmpeg无法解析的文件格式(wmv9,rm,rmvb等),可以先用别的工具(mencoder)转换为avi(ffmpeg能解析的)格式.实例是将上传视频转码为flv格式,该格式ffmpeg支持,所以我们实例中需要ffmpeg视频处理工具.数据库MySQL5.5实例所需要的数据库脚本drop database if exists db_mediaplayer;create database db_mediaplayer;use db_mediaplayer;create table tb_media(id int not null primary key auto_increment comment '主键' ,title varchar(50) not null comment '视频名称' ,src varchar(200) not null comment '视频存放地址' ,picture varchar(200) not null comment '视频截图' ,descript varchar(400) comment '视频描述' ,uptime varchar(40) comment '上传时间');desc tb_media;项目结构图:上传视频界面设计在上传文件时,Form表单中enctype属性值必须为"multipart/form-data".模块界面设计如下图:enctype属性值说明application/x-www-form-urlencoded表单数据被编码为名称/值对,这是标准的编码格式multipart/form-data表单数据被编码为一条消息,页面上每个控件对应消息中的一部分text/plain表单数据以纯文本形式进行编码,其中不含任何控件格式的字符业务接口定义面向接口编程,接口中定义系统功能模块.这样方便理清业务,同时接口的对象必须由实现了该接口的对象来创建.这样就避免编码中的某些业务遗漏等,同时扩展性也增强了.package com.webapp.dao;import java.util.List;import com.webapp.entity.Media;/**** MediaDao.java** @version :1.1** @author :苏若年<a href="mailto:DennisIT@">发送邮件</a>** @since :1.0 创建时间: 2013-2-07 上午10:19:54** TODO : interface MediaDao.java is used for ...**/public interface MediaDao {/*** 视频转码* @param ffmpegPath 转码工具的存放路径* @param upFilePath 用于指定要转换格式的文件,要截图的视频源文件* @param codcFilePath 格式转换后的的文件保存路径* @param mediaPicPath 截图保存路径* @return* @throws Exception*/public boolean executeCodecs(String ffmpegPath,String upFilePath, String codcFilePath, String mediaPicPath)throws Exception;/*** 保存文件* @param media* @return* @throws Exception*/public boolean saveMedia(Media media)throws Exception;/*** 查询本地库中所有记录的数目* @return* @throws Exception*/public int getAllMediaCount()throws Exception;/*** 带分页的查询* @param firstResult* @param maxResult* @return*/public List<Media> queryALlMedia(int firstResult, int maxResult)throws Exception;/*** 根据Id查询视频* @param id* @return* @throws Exception*/public Media queryMediaById(int id)throws Exception;}接口的实现,这里列出ffmpeg视频转码与截图模块/*** 视频转码* @param ffmpegPath 转码工具的存放路径* @param upFilePath 用于指定要转换格式的文件,要截图的视频源文件* @param codcFilePath 格式转换后的的文件保存路径* @param mediaPicPath 截图保存路径* @return* @throws Exception*/public boolean executeCodecs(String ffmpegPath, String upFilePath, String codcFilePath, String mediaPicPath) throws Exception {// 创建一个List集合来保存转换视频文件为flv格式的命令List<String> convert = new ArrayList<String>();convert.add(ffmpegPath); // 添加转换工具路径convert.add("-i"); // 添加参数"-i",该参数指定要转换的文件convert.add(upFilePath); // 添加要转换格式的视频文件的路径convert.add("-qscale"); //指定转换的质量convert.add("6");convert.add("-ab"); //设置音频码率convert.add("64");convert.add("-ac"); //设置声道数convert.add("2");convert.add("-ar"); //设置声音的采样频率convert.add("22050");convert.add("-r"); //设置帧频convert.add("24");convert.add("-y"); // 添加参数"-y",该参数指定将覆盖已存在的文件convert.add(codcFilePath);// 创建一个List集合来保存从视频中截取图片的命令List<String> cutpic = new ArrayList<String>();cutpic.add(ffmpegPath);cutpic.add("-i");cutpic.add(upFilePath); // 同上(指定的文件即可以是转换为flv格式之前的文件,也可以是转换的flv文件)cutpic.add("-y");cutpic.add("-f");cutpic.add("image2");cutpic.add("-ss"); // 添加参数"-ss",该参数指定截取的起始时间cutpic.add("17"); // 添加起始时间为第17秒cutpic.add("-t"); // 添加参数"-t",该参数指定持续时间cutpic.add("0.001"); // 添加持续时间为1毫秒cutpic.add("-s"); // 添加参数"-s",该参数指定截取的图片大小cutpic.add("800*280"); // 添加截取的图片大小为350*240cutpic.add(mediaPicPath); // 添加截取的图片的保存路径boolean mark = true;ProcessBuilder builder = new ProcessBuilder();try {mand(convert);builder.redirectErrorStream(true);builder.start();mand(cutpic);builder.redirectErrorStream(true);// 如果此属性为true,则任何由通过此对象的start() 方法启动的后续子进程生成的错误输出都将与标准输出合并,//因此两者均可使用Process.getInputStream() 方法读取。

jave(java的ffmpeg框架)简单使用

jave(java的ffmpeg框架)简单使用

jave(java的ffmpeg框架)简单使⽤引⼊⽂件(jave-native-win64 windows 64位系统jave-native-linux64 linux 64位系统按⾃⼰服务器系统来替换)<dependency><groupId>ws.schild</groupId><artifactId>jave-core</artifactId><version>2.4.6</version></dependency><dependency><groupId>ws.schild</groupId><artifactId>jave-native-win64</artifactId><version>2.4.6</version></dependency>压缩视频⾳频使⽤ libmp3lame 压缩,ios默认播放器播放会没有声⾳,还是使⽤aacFile source = new File("e:/视频/第⼋课.mp4");File target = new File("e:/视频/第⼋课_ys.mp4");long time = System.currentTimeMillis();try {MultimediaObject object = new MultimediaObject(source);AudioInfo audioInfo = object.getInfo().getAudio();AudioAttributes audio = new AudioAttributes();audio.setCodec("aac");if(audioInfo.getBitRate() > 128000){audio.setBitRate(new Integer(128000));}audio.setChannels(audioInfo.getChannels());if(audioInfo.getSamplingRate() > 48050){audio.setSamplingRate(new Integer(48050));}VideoInfo videoInfo = object.getInfo().getVideo();VideoAttributes video = new VideoAttributes();video.setCodec("h264");if(videoInfo.getBitRate() > 800000){video.setBitRate(new Integer(800000));}if(videoInfo.getFrameRate() > 20){video.setFrameRate(new Integer(20));}int width = videoInfo.getSize().getWidth();int height = videoInfo.getSize().getHeight();if(width > 1280){float rat = (float) width / 1280;video.setSize(new VideoSize(1280,(int)(height/rat)));}EncodingAttributes attr = new EncodingAttributes();attr.setFormat("mp4");attr.setAudioAttributes(audio);attr.setVideoAttributes(video);Encoder encoder = new Encoder();encoder.encode(object, target, attr);System.out.println("耗时:" + (System.currentTimeMillis() - time)/1000);} catch (Exception e) {e.printStackTrace();}获取视频某个帧的图⽚long times = System.currentTimeMillis();File source = new File("e:/视频/第⼋课_ys.mp4");File target = new File("e:/视频/第⼋课_ys.png");MultimediaObject object = new MultimediaObject(source);try {VideoInfo videoInfo = object.getInfo().getVideo();VideoAttributes video = new VideoAttributes();video.setCodec("png");video.setSize(videoInfo.getSize());EncodingAttributes attrs = new EncodingAttributes();attrs.setFormat("image2");attrs.setOffset(3f);//设置偏移位置,即开始转码位置(3秒)attrs.setDuration(0.01f);//设置转码持续时间(0.01秒)attrs.setVideoAttributes(video);Encoder encoder = new Encoder();encoder.encode(object,target,attrs);} catch (EncoderException e) {e.printStackTrace();}System.out.println("耗时:"+(System.currentTimeMillis() - times));。

基于Java的在线影音播放器开发及优化

基于Java的在线影音播放器开发及优化

基于Java的在线影音播放器开发及优化一、引言随着互联网的普及和网络带宽的提升,在线影音播放器已经成为人们日常娱乐生活中不可或缺的一部分。

基于Java语言的在线影音播放器具有跨平台性、易维护性和良好的扩展性等优点,因此备受开发者青睐。

本文将探讨基于Java的在线影音播放器的开发过程以及优化方法,帮助开发者更好地实现高性能、稳定可靠的在线影音播放器。

二、开发环境搭建在进行基于Java的在线影音播放器开发之前,首先需要搭建相应的开发环境。

通常情况下,我们可以选择使用JavaFX作为界面开发框架,结合FFmpeg等多媒体处理库来实现音视频播放功能。

同时,还需要考虑到网络通信模块的集成,以实现在线流媒体播放功能。

三、功能设计与实现1. 音视频格式支持在开发在线影音播放器时,需要考虑支持常见的音视频格式,如MP4、AVI、MKV等。

通过集成FFmpeg等多媒体处理库,可以实现对不同格式的音视频文件进行解码和播放。

2. 播放控制功能在线影音播放器通常具备播放、暂停、快进、快退、音量调节等基本控制功能。

通过JavaFX提供的界面组件和事件处理机制,可以轻松实现这些功能,并提供良好的用户体验。

3. 网络流媒体支持为了实现在线直播和点播功能,需要集成网络通信模块,支持HTTP、RTMP等流媒体协议。

通过网络请求和数据解析,可以实现从网络获取音视频数据并进行实时播放。

四、性能优化策略1. 资源管理优化在播放大规模音视频文件时,需要合理管理内存和线程资源,避免内存泄漏和资源浪费。

可以通过使用线程池管理线程、定时清理无用资源等方式来优化资源管理。

2. 缓冲策略优化为了提高在线影音播放器的流畅度和加载速度,可以采用预加载、分段缓冲等策略来优化缓冲机制。

通过合理设置缓冲区大小和加载策略,可以有效减少卡顿和加载时间。

3. 码率自适应优化针对不同网络环境和设备性能,可以实现码率自适应功能,根据当前网络带宽和设备性能动态调整音视频码率。

Java应用开发中的音频和视频处理技术

Java应用开发中的音频和视频处理技术

Java应用开发中的音频和视频处理技术随着互联网和移动设备的快速发展,音频和视频的传输和处理逐渐成为应用开发的重要方向。

在Java开发领域中,有很多技术可以用于音频和视频的处理和应用,本文将探讨其中的一些重要技术和应用场景。

一、音频处理技术在Java应用开发中,音频处理技术主要包括音频文件的解码与编码、音频录制与播放、音频特效处理等方面。

1. 音频文件的解码与编码Java提供了丰富的库和API,使得开发者可以方便地解码和编码音频文件。

常用的音频格式如MP3、WAV等,可以通过Java音频解码器(Java Sound API)进行解码,便于进一步处理和应用。

同样,通过音频编码器,可以将音频数据编码成特定的格式进行存储和传输。

2. 音频录制与播放音频的录制和播放是音频应用中常见的功能,Java中提供了相应的类和接口,比如AudioRecord和AudioTrack,使得开发者可以方便地进行音频的录制和播放操作。

通过音频录制技术,可以实现语音识别、语音合成等应用;而通过音频播放技术,可以实现音乐播放、语音导航等功能。

3. 音频特效处理音频特效处理是提升音频质量和增加音频趣味性的一种方式。

Java 中提供了一些音频特效处理的API,比如混响效果、均衡器效果等。

通过这些技术,可以对音频进行混音、降噪、变声等操作,满足用户对音频效果的个性化需求。

二、视频处理技术在Java应用开发中,视频处理技术主要包括视频编解码、视频录制与播放、视频流处理等方面。

1. 视频编解码视频编解码是视频应用中的核心技术之一。

在Java开发领域中,可以使用FFmpeg等开源库进行视频编解码,这些库支持多种常用的视频格式,比如MP4、AVI等。

通过视频编解码技术,可以将视频数据转化为可供应用使用的格式,实现视频的播放和编辑等功能。

2. 视频录制与播放Java提供了丰富的类和接口,使得开发者可以方便地进行视频的录制和播放。

其中,JFrame类可以用于视频显示窗口的创建和管理,通过Java Media Framework(JMF)可以实现视频的录制和播放操作。

2023音视频编解码 文件格式 协议内容详解

2023音视频编解码 文件格式 协议内容详解

音视频编解码文件格式协议内容详解1. 音视频编解码的概念音视频编解码(Audio Video c)是指将音频和视频信号转换为数字数据的过程,在传输或存储过程中,对音频和视频数据进行编码压缩,以减小数据量,并在接收端解码还原为可播放的音频和视频信号。

音视频编解码技术广泛应用于各种领域,如在线音乐、实时通信、流媒体等。

2. 音视频文件格式音视频文件格式(Audio Video File Format)是指保存音频和视频数据的文件格式,常见的音视频文件格式有MP3、WAV、MP4、AVI等。

不同的文件格式对音视频数据的存储方式、压缩方式等有所差异。

2.1 MP3MP3(MPEG-1 Audio Layer 3)是一种常见的音频文件格式,它使用了无损压缩算法,可以在保证音质的前提下减小文件大小。

MP3文件可以存储音乐、语音等音频数据,也可以包含元数据,如艺术家、专辑等信息。

2.2 WAVWAV(Waveform Audio File Format)是一种无损的音频文件格式,它通常用于存储音频数据,如音乐、语音等。

WAV文件采用基于 PCM (Pulse Modulation)的编码方式,保证了音频数据的高保真性,但文件大小相比压缩格式较大。

2.3 MP4MP4(MPEG-4 Part 14)是一种常见的视频文件格式,它使用了基于ISO媒体文件格式的容器格式,可以同时包含音频、视频及字幕等多种媒体数据。

MP4文件常用于存储电影、电视剧等视频内容,采用了高效的视频编码算法,可以在较小的文件大小下保留较高的视觉质量。

2.4 AVIAVI(Audio Video Interleave)是一种多媒体容器格式,常用于存储音频和视频数据。

AVI文件可以使用不同的音频和视频编解码器进行压缩和解压缩,因此支持的音视频格式较为广泛。

但AVI文件的兼容性较差,对于某些编码格式可能无法正确解码。

3. 音视频协议内容详解音视频协议(Audio Video Protocol)是指在音视频传输过程中,定义了数据传输格式、协议头、包格式等细节内容,以确保发送端和接收端可以正确地解析、处理音视频数据。

java仅用30行代码就实现了视频转音频的批量转换

java仅用30行代码就实现了视频转音频的批量转换

java仅⽤30⾏代码就实现了视频转⾳频的批量转换本功能实现需要⽤到第三⽅jar包 jave,JAVE 是java调⽤FFmpeg的封装⼯具。

spring boot项⽬pom⽂件中添加以下依赖<!-- https:///artifact/ws.schild/jave-core --><dependency><groupId>ws.schild</groupId><artifactId>jave-core</artifactId><version>3.1.1</version></dependency><!-- 以下依赖根据系统⼆选⼀ --><!-- win系统平台的依赖 --><dependency><groupId>ws.schild</groupId><artifactId>jave-nativebin-win64</artifactId><version>3.1.1</version></dependency><!-- linux系统平台的依赖 --><dependency><groupId>ws.schild</groupId><artifactId>jave-nativebin-linux64</artifactId><version>3.1.1</version></dependency>Java单类实现代码,复制到Spring boot项⽬中,⽤idea编辑器主⽅法运⾏。

import ws.schild.jave.Encoder;import ws.schild.jave.EncoderException;import ws.schild.jave.MultimediaObject;import ws.schild.jave.encode.AudioAttributes;import ws.schild.jave.encode.EncodingAttributes;import java.io.File;import java.util.Arrays;public class VideoToAudio {//要输出的⾳频格式private static String outputFormat="mp3";/*** 获得转化后的⽂件名* @param sourceFilePath : 源视频⽂件路径* @return*/public static String getNewFileName(String sourceFilePath) {File source = new File(sourceFilePath);String fileName=source.getName().substring(0, source.getName().lastIndexOf("."));return fileName+"."+outputFormat;}/*** 转化⾳频格式* @param sourceFilePath : 源视频⽂件路径* @param targetFilePath : ⽬标⾳乐⽂件路径* @return*/public static void transform(String sourceFilePath, String targetFilePath) {File source = new File(sourceFilePath);File target = new File(targetFilePath);// 设置⾳频属性AudioAttributes audio = new AudioAttributes();audio.setCodec(null);// 设置转码属性EncodingAttributes attrs = new EncodingAttributes();attrs.setOutputFormat(outputFormat);attrs.setAudioAttributes(audio);try {// ⾳频转换格式类Encoder encoder = new Encoder();MultimediaObject mediaObject=new MultimediaObject(source);encoder.encode(mediaObject, target, attrs);System.out.println("转换已完成...");} catch (EncoderException e) {e.printStackTrace();}}/*** 批量转化⾳频格式* @param sourceFolderPath : 源视频⽂件夹路径* @param targetFolderPath : ⽬标⾳乐⽂件夹路径* @return*/public static void batchTransform(String sourceFolderPath, String targetFolderPath) {File sourceFolder = new File(sourceFolderPath);if(sourceFolder.list().length!=0){Arrays.asList(sourceFolder.list()).forEach(e->{transform(sourceFolderPath+"\\"+e, targetFolderPath+"\\"+getNewFileName(e));});}}public static void main(String[] args) {batchTransform("C:\\Users\\tarzan\\Desktop\\video","C:\\Users\\tarzan\\Desktop\\audio"); }}运⾏结果截图测试结果视频格式为mp4,⼤⼩约6.65MB,转为⾳频格式MP3,⼤⼩约1.60MB,转化时间1s左右。

  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 **.logffmpeg.exe -i **.mp4 **.aacffmpeg.exe -i **.mp4 **.h264 -vstats_file **.logffmpeg.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 bslbfID; 1 bslbflayer; 2 uimsbfprotection_absent; 1 bslbfprofile; 2 uimsbfsampling_frequency_index; 4 uimsbfprivate_bit; 1 bslbfchannel_configuration; 3 uimsbforiginal/copy; 1 bslbfhome; 1 bslbf}adts_variable_header(){copyright_identification_bit; 1 bslbfcopyright_identification_start; 1 bslbfframe_length; 13 bslbfadts_buffer_fullness; 11 bslbfnumber_of_raw_data_blocks_in_frame; 2 uimsfb}adts_fixed_header(){syncword; 12 bslbfID; 1 bslbflayer; 2 uimsbfprotection_absent; 1 bslbfprofile; 2 uimsbfsampling_frequency_index; 4 uimsbfprivate_bit; 1 bslbfchannel_configuration; 3 uimsbforiginal/copy; 1 bslbfhome; 1 bslbf}adts_variable_header(){copyright_identification_bit; 1 bslbfcopyright_identification_start; 1 bslbfframe_length; 13 bslbfadts_buffer_fullness; 11 bslbfnumber_of_raw_data_blocks_in_frame; 2 uimsfb}可以看到,两部分各28比特位,共56比特位,7字节.首两个字节一般都是1111 1111 1111 0001,如果音频数据包含crc校验信息,最后一位就是0(看文档是这样的,但没有实作).对应关系如下:syncword 1111 1111 1111ID 0layer 00protection_absent 1然后接下来的一个半字节,如下:profile 两位,见下表sampling_frequency_index 四位,见下表private_bit 0channel_configuration 三位,见下表,立体声为2,即010original_copy 0home 0这部分标志位需要解释一下,援引标准文档profileTable 31 – Profiles0 Main profile1 Low Complexity profile (LC)2 Scalable Sampling Rate profile (SSR)3 (reserved)再看Variable部分前两位,一般都是00copyright_identification_bit 0copyright_identification_start 0数值,等于数据包大小加上7--header的大小.其实就是第二个adts chunck的起始地址. frame_length 00 0001 1000 000全是1,即0x7FFadts_buffer_fullness 1 1111 1111 11一般为00number_of_raw_data_blocks_in_frame 00比特位映像:Java代码1111111111110 00 1xx xx-xx 0 x-x x 0 00 0 xx-xxxxxxxxxxx 1-11111111-11 001111111111110 00 1xx xx-xx 0 x-x x 0 00 0 xx-xxxxxxxxxxx 1-11111111-11 00这里附一些我解析aac文件的代码:Java代码private long parse(long offset) throws CannotParseException {int fl = 0;try {is.skip(offset);byte[] syncword = new byte[2];int i = is.read(syncword);if (i != -1) {if (syncword[0] == -1 && (syncword[1] & -15) == -15) {is.skip(1);byte[] framelength = new byte[3];int k = is.read(framelength);if (k != -1) {byte front = (byte) (framelength[0] & 3);byte middle = framelength[1];byte end = (byte) (((framelength[2] & -32) >> 5) & 7);fl |= front;fl <<= 8;fl |= middle;fl <<= 3;fl |= end;AudioBean bean = new AudioBean();bean.setFramenum(++blocks);bean.setOffset(fl);bean.setPosition(position);list.add(bean);position += fl;} else {return -1;}} else {return -1;}} else {("aac file that length's : " + position + " parse done!");return 0;}} catch (IOException ex) {logger.error("during parse aac file occur unexpected exception", ex);throw new CannotParseException(ex);}return fl - 7 + 1;}private long parse(long offset) throws CannotParseException {int fl = 0;try {is.skip(offset);byte[] syncword = new byte[2];int i = is.read(syncword);if (i != -1) {if (syncword[0] == -1 && (syncword[1] & -15) == -15) { is.skip(1);byte[] framelength = new byte[3];int k = is.read(framelength);if (k != -1) {byte front = (byte) (framelength[0] & 3);byte middle = framelength[1];byte end = (byte) (((framelength[2] & -32) >> 5) & 7);fl |= front;fl <<= 8;fl |= middle;fl <<= 3;fl |= end;AudioBean bean = new AudioBean();bean.setFramenum(++blocks);bean.setOffset(fl);bean.setPosition(position);list.add(bean);position += fl;} else {return -1;}} else {return -1;}} else {("aac file that length's : " + position + " parse done!");return 0;}} catch (IOException ex) {logger.error("during parse aac file occur unexpected exception", ex);throw new CannotParseException(ex);}return fl - 7 + 1;}递归上面这个方法,记录一些关键的字段,保存到list里,这里我定义了一个对象AudioBean,他继承于MediaBean,没有子类字段。

相关文档
最新文档