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左右。

mp4文件格式详细解析

mp4文件格式详细解析

mp4⽂件格式详细解析⽬录1. 概述2. mp4⽂件基本信息3. 封装格式重要概念4. 重要box介绍5. 其他box介绍6. 实⽤技术7. 开源软件参考[1] ISO/IEC 14496-12:2015[2] wikipedia/MPEG-4[3] wikipedia/ISO base media file format[4] wikipedia/MPEG-4 Part 14[5] Tocy/多媒体⽂件格式之MP4[6] Phil Cluff/What's in the box_![7] /gpac/mp4box.js[8] tao/Android⾳视频系列:视频容器操作篇 -- mp4容器打包实现[9] LiaoJunXiong/使⽤gpac封装mp4[10] Jameson Steiner/Fun with Container Formats – Part 21. 概述mp4或称MPEG-4 Part 14,是⼀种多媒体容器格式,扩展名为.mp4。

历史[6]:2001年,apple的QuickTime格式,.qt和.mov的后缀名。

2001年,MPEG-4 Part1,把基于QuickTime的box布局的容器格式添加到了MPEG-4标准。

2004年,标准⽂档把编码和容器格式的说明分开。

MPEG-4 Part12,定义了容器格式通⽤的box结构,即ISO媒体⽂件格式(ISO base media file format, ISOBMFF)。

MPEG-4 Part14,基于Part12进⾏了细化,定义了⽤于存储MPEG-4内容的容器格式,即.mp4格式。

图1 MP4 File Format.png以下是各标准⽂档的链接:QuickTime:QuickTime/QTFFMPEG-4 Part12:ISO/IEC 14496-12:2015MPEG-4 Part14:ISO/IEC 14496-14:2018,官⽹上这部分是付费的。

Java应用中的音频与视频处理

Java应用中的音频与视频处理

Java应用中的音频与视频处理在当今数字化时代,音频与视频处理已成为Java应用中的重要组成部分。

无论是在媒体播放器、语音识别、视频编辑还是在线教育等领域,Java都扮演着关键角色。

本文将探讨Java应用中的音频与视频处理的相关技术和实践。

一、音频处理1.1 音频格式音频文件通常以不同的格式存储,如MP3、WAV、FLAC等。

Java提供了丰富的库和工具,使开发者能够读取、写入和处理各种音频格式。

通过使用Java音频库(javax.sound),我们可以轻松地处理音频文件。

1.2 音频录制与播放Java可以利用javax.sound.sampled包中的类来实现音频的录制与播放功能。

通过使用TargetDataLine类,我们可以从音频设备中读取音频数据,而SourceDataLine类则用于将音频数据输出到设备。

这些类提供了一种简单而有效的方式来处理音频输入和输出。

1.3 音频处理效果音频处理效果是提升音频质量的重要手段之一。

Java中提供了一些开源的库和工具,如javazoom.jl.converter和TarsosDSP等,可以用于添加均衡器、混响、降噪等效果,以改善音频的声音质量和清晰度。

二、视频处理2.1 视频格式与音频类似,视频文件也以不同的格式存储,如MP4、AVI、MKV等。

Java通过使用开源框架FFmpeg,可以对不同的视频格式进行处理。

FFmpeg是一个跨平台的多媒体处理工具,支持压缩、转码、剪辑等功能。

2.2 视频播放与捕捉JavaFX是Java平台下用于构建富应用程序的工具包,它包含了用于视频播放的媒体类。

通过使用JavaFX提供的MediaPlayer类,我们可以加载和播放各种视频格式。

此外,Java还提供了类似于音频处理中的TargetDataLine和SourceDataLine类似的类,如VideoCapture用于捕捉实时视频流。

2.3 视频编辑与特效音频和视频处理往往需要对媒体进行编辑和添加特效。

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视频处理

JAVE视频处理

JAVE视频处理⼀.通过JAVE可以实现视频剪切,压缩,提取⾳乐等操作JAVE.jar()是⼀个封装了FFmpeg的Java框架,在项⽬中能直接调⽤它的API来处理⾳视频⽂件;优点:使⽤⽅便,直接在项⽬中引⼊JAVE.jar即可处理媒体⽂件,且开发完成后可以随⼯程⼀起打包发布,不需要在⽬标运⾏环境内⼿动安装FFmpeg相关的类库缺点:JAVE.jar最后⼀次更新是2009年,其封装的FFmpeg版本是09年或更早前的版本,⽐较⽼旧,⽆法使⽤⼀些新特性(当然也可以看看有没有其他⽐较新的封装了FFmpeg的框架)⼆ .关键⽂档介绍⾳频/视频编码最重要的JAVE类是it.sauronsoftware.jave.Encoder。

编码器对象公开了许多⽤于多媒体转码的⽅法。

为了使⽤JAVE,您始终必须创建⼀个Encoder:Encoder encoder = new Encoder();创建实例后,您可以开始调⽤encode()⽅法进⾏转码:public void encode(java.io.File source,java.io.File target,it.sauronsoftware.jave.EncodingAttributes attributes)throws ng.IllegalArgumentException,it.sauronsoftware.jave.InputFormatException,it.sauronsoftware.jave.EncoderException第⼀个参数source表⽰要解码的源⽂件。

第⼆个参数target,是将要创建和编码的⽬标⽂件。

所述属性参数,其类型为it.sauronsoftware.jave.EncodingAttributes,是含有由编码器所需要的任何信息的数据结构。

请注意,对encode()的调⽤是⼀个阻塞的调⽤:该⽅法仅在转码操作完成(或失败)后才返回。

javacv视频抽帧的实现过程详解(附代码)

javacv视频抽帧的实现过程详解(附代码)

javacv视频抽帧的实现过程详解(附代码)视频抽帧可以做⼀些处理,⽐如⽔印,去⽔印等操作,然后再合成视频。

下⾯直接上代码:引⼊maven步骤看这⾥直接上关键操作:/*** 视频⽂件指定时间段的帧截取* @param file* @param start* @param end*/public static List<File> videoIntercept(File file, Integer start, Integer end) {Frame frame = null;List<File> files = Lists.newArrayList();FFmpegFrameGrabber fFmpegFrameGrabber = new FFmpegFrameGrabber(file);String filePath = "D://video//images//";String fileTargetName = "movie";try {fFmpegFrameGrabber.start();int ftp = fFmpegFrameGrabber.getLengthInFrames();System.out.println("开始视频提取帧");for (int i=0 ; i < ftp ; i++){if( i >= start && i <= end){frame = fFmpegFrameGrabber.grabImage();doExecuteFrame(frame, filePath, fileTargetName, i ,files);}}System.out.println("============运⾏结束============");fFmpegFrameGrabber.stop();} catch (IOException E) {// Loggers.ERROR.error("视频抽帧异常", e);}return files;}public static void doExecuteFrame(Frame frame, String targetFilePath, String targetFileName, int index ,List<File> files) {if ( frame == null || frame.image == null) {return;}Java2DFrameConverter converter = new Java2DFrameConverter();String imageMat = "jpg";String fileName = targetFilePath + targetFileName + "_" + index + "." + imageMat;BufferedImage bi = converter.getBufferedImage(frame);File output = new File(fileName);files.add(output);try{ImageIO.write(bi, imageMat, output);} catch (IOException e) {e.printStackTrace();}}public static void main(String[] args) {List<File> files = videoIntercept(new File("D://video//1553583033205-480p.mp4"), 10, 20);System.out.println(files);}我们可以看到⽂件夹下抽取了视频的第10,20之间的帧。

移动应用开发中的音视频播放技术

移动应用开发中的音视频播放技术

移动应用开发中的音视频播放技术在移动互联网时代,音视频播放技术在移动应用开发中起着重要的作用。

随着网络带宽的提升和智能手机硬件的不断升级,人们对高质量音视频内容的需求也逐渐增加。

然而,移动设备的资源受限,对音视频播放技术提出了新的挑战。

本文将从音视频格式、编解码、网络传输和用户体验等方面探讨移动应用开发中的音视频播放技术。

一、音视频格式音视频格式是指音频和视频数据的封装格式。

常见的音视频格式有MP4、AVI、FLV、MKV等。

在移动应用开发中,常用的音视频格式是MP4。

MP4格式具有较好的兼容性和压缩性能,能够兼容多种设备和平台,并且能够有效地压缩音视频数据,减小文件大小,提高播放效果。

二、编解码编解码是指将音视频数据从原始格式转换为可播放的格式。

在移动应用开发中,为了降低播放延迟和提高播放质量,通常采用硬件解码来实现对音视频数据的解码。

硬件解码器通常集成在移动设备的芯片中,能够利用硬件加速技术,提高解码效率和性能。

同时,由于不同设备和平台对编码器的支持程度不同,开发者需要根据目标用户群体的设备特性选择合适的编解码器,以保证音视频播放的流畅性和兼容性。

三、网络传输在移动应用开发中,音视频数据通常通过网络进行传输。

网络传输的质量和稳定性对于音视频播放来说尤为重要。

为了提高用户体验,开发者需要选择合适的传输协议和使用合理的传输方式。

常用的音视频传输协议有RTMP、HTTP Live Streaming(HLS)和Dynamic Adaptive Streaming over HTTP(DASH)。

这些协议能够根据网络情况动态调整视频的码率和分辨率,以保证用户在不同网络环境下都能够获得较好的播放效果。

四、用户体验在移动应用开发中,用户体验是至关重要的。

对于音视频播放来说,音质和画面的清晰度是用户关注的重点。

为了提供良好的用户体验,开发者可以通过以下几个方面进行优化。

首先,使用合适的音频编码算法和音频处理技术,提供清晰、真实的音质。

MP4文件格式解析

MP4文件格式解析

MP4⽂件格式解析⽂章转⾃:1.ISO/IEC 14496标准ISO/IEC 14496是MPEG专家组制定的MPEG-4标准,分为多个部分(仍在更新)。

参考:第⼀部分(ISO/IEC 14496-1):系统:描述视频和⾳频数据流的控制、同步以及混合⽅式(即混流Multiplexing,简写为MUX)。

第⼆部分(ISO/IEC 14496-2):视频:定义⼀个对各种视觉信息(包括⾃然视频、静⽌纹理、计算机合成图形等等)的编解码器。

(例如XviD编码就属于MPEG-4 Part 2)第三部分(ISO/IEC 14496-3):⾳频:定义⼀个对各种⾳频信号进⾏编码的编解码器的集合。

包括⾼级⾳频编码(Advanced Audio Coding,缩写为AAC)的若⼲变形和其他⼀些⾳频/语⾳编码⼯具。

第四部分(ISO/IEC 14496-4):⼀致性:定义对本标准其他的部分进⾏⼀致性测试的程序。

第五部分(ISO/IEC 14496-5):参考软件:提供⽤于演⽰功能和说明本标准其他部分功能的软件。

第六部分(ISO/IEC 14496-6):多媒体传输集成框架(DMIF for Delivery Multimedia Integration Framework)第七部分(ISO/IEC 14496-7):优化的参考软件:提供对实现进⾏优化的例⼦(这⾥的实现指的是第五部分)。

第⼋部分(ISO/IEC 14496-8):在IP⽹络上传输:定义在IP⽹络上传输MPEG-4内容的⽅式。

第九部分(ISO/IEC 14496-9):参考硬件:提供⽤于演⽰怎样在硬件上实现本标准其他部分功能的硬件设计⽅案。

第⼗部分(ISO/IEC 14496-10):⾼级视频编码或称⾼级视频编码(Advanced Video Coding,缩写为AVC):定义⼀个视频编解码器(codec)。

AVC和XviD都属于MPEG-4编码,但由于AVC属于MPEG-4 Part 10,在技术特性上⽐属于MPEG-4 Part2的XviD要先进。

mp4parser 原理

mp4parser 原理

mp4parser 原理MP4Parser是一个用于处理MP4文件的Java库。

它提供了一种方便的方式来读取、修改和创建MP4文件,使开发人员能够轻松地操作和管理这些文件。

MP4(MPEG-4 Part 14)是一种常用的多媒体容器格式,广泛用于存储和传输音频、视频和字幕等数据。

MP4文件由一系列的媒体原子构成,这些原子包含了媒体数据和元数据,以及描述文件结构的信息。

MP4Parser的目标就是提供一种简单的方式来解析和操作这些原子。

MP4Parser的原理基于解析MP4文件的结构。

它通过逐个读取文件中的原子,解析其类型和大小,并根据需要进行相应的处理。

例如,如果需要读取媒体数据,MP4Parser会找到包含该数据的原子,并提供访问该数据的方法。

类似地,如果需要修改文件的元数据,MP4Parser会定位到相应的原子,并提供修改其内容的接口。

MP4Parser的另一个重要功能是创建MP4文件。

通过使用MP4Parser,开发人员可以按照需要构建MP4文件的结构,并向其中添加媒体数据和元数据。

例如,可以创建一个空白的MP4文件,并逐步添加音频和视频轨道,以及相应的元数据。

MP4Parser的设计目标是简单易用,同时提供足够的灵活性和功能。

它的代码结构清晰,功能模块化,使开发人员能够方便地集成到自己的项目中。

此外,MP4Parser还提供了一些高级功能,如支持分段文件和多线程处理等。

MP4Parser是一个强大而灵活的Java库,用于处理MP4文件。

它提供了一种简单而直观的方式来读取、修改和创建MP4文件,使开发人员能够轻松地操作和管理这些文件。

无论是解析文件结构、读取媒体数据,还是修改元数据、创建新文件,MP4Parser都能满足开发人员的需求,并提供高效可靠的功能。

java拼接ffmpeg命令的方法

java拼接ffmpeg命令的方法

java拼接ffmpeg命令的方法以Java拼接FFmpeg命令的方法FFmpeg是一个开源的音视频处理工具,可以用于实现音视频的剪辑、转码、合并等功能。

而在Java中,我们可以通过拼接字符串的方式来构建FFmpeg命令,从而实现对音视频的处理。

本文将介绍如何使用Java拼接FFmpeg命令,以及一些常用的拼接方式和注意事项。

一、使用Java拼接FFmpeg命令的基本方法在Java中,我们可以使用字符串拼接的方式来构建FFmpeg命令。

首先,我们需要创建一个空的字符串变量,用于存储拼接后的命令。

然后,我们可以通过字符串拼接的方式,将FFmpeg的命令参数逐步添加到该字符串变量中。

最后,我们可以使用Java提供的ProcessBuilder类来执行该命令。

下面是一个简单的示例,演示了如何使用Java拼接FFmpeg命令来进行视频转码:```javaString ffmpegCmd = "ffmpeg -i input.mp4 -c:v libx264 -c:a aac output.mp4";```在上述示例中,我们首先将FFmpeg的命令名称"ffmpeg"添加到字符串变量中。

然后,我们使用"-i"参数指定输入文件"input.mp4",使用"-c:v"参数指定视频编码器"libx264",使用"-c:a"参数指定音频编码器"aac",最后使用"output.mp4"指定输出文件名。

通过字符串拼接的方式,我们将这些参数逐一添加到字符串变量中,最终得到完整的FFmpeg命令。

二、拼接FFmpeg命令的常用方式除了基本的拼接方式外,我们还可以使用一些常用的方法来简化拼接过程。

下面列举了一些常用的拼接方式:1. 使用String.format()方法:```javaString input = "input.mp4";String output = "output.mp4";String ffmpegCmd = String.format("ffmpeg -i %s -c:v libx264 -c:a aac %s", input, output);```在上述示例中,我们使用String.format()方法来格式化字符串,将输入文件和输出文件的变量值填充到命令字符串中。

javacv 调用摄像头方法

javacv 调用摄像头方法

javacv 调用摄像头方法摘要:1.JavaCV简介2.调用摄像头方法3.代码示例及解析4.总结正文:## 1.JavaCV简介JavaCV(Java Code Library for Video and Audio)是一个开源的Java 库,用于处理音视频数据。

它为开发者提供了丰富的功能,如视频采集、编码、解码、剪辑等。

JavaCV在许多项目中都有广泛应用,如实时通信、视频监控、人脸识别等。

## 2.调用摄像头方法要在JavaCV中调用摄像头,我们需要使用`FFmpegFrameGrabber`和`JavaCVFrameConverter`类。

以下是一个简单的示例,展示了如何使用这两个类来获取摄像头视频流并实时显示。

## 3.代码示例及解析```javaimport org.bytedeco.javacv.*;import org.bytedeco.javacv.opencv.OpenCVFrameConverter;public class CameraDemo {public static void main(String[] args) throws Exception {// 创建一个FFmpegFrameGrabber对象,参数为摄像头索引(0表示默认摄像头)FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(0);// 设置帧率、图像宽高grabber.setFrameRate(30);grabber.setVideoSize(640, 480);// 设置帧转换器,将OpenCV格式的帧转换为JavaCV格式的帧OpenCVFrameConverter.ToJavaFrame converter = new OpenCVFrameConverter.ToJavaFrame();// 创建一个FrameRecorder对象,用于将摄像头视频流输出到窗口或文件FrameRecorder recorder = newFrameRecorder("output.mp4", 640, 480, grabber.getFrameRate());// 开始捕获摄像头视频流grabber.start(Thread.NEXT_FRAME);// 循环处理每一帧Frame frame;while ((frame = grabber.grab()) != null) {// 将帧转换为JavaCV格式JavaFrame convertedFrame = converter.convert(frame);// 处理帧(如:显示、编码等)// 以下示例将帧显示在窗口中CanvasFrame canvas = new CanvasFrame("Camera Preview");canvas.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);canvas.setSize(640, 480);canvas.setVisible(true);canvas.getGraphics().drawImage(convertedFrame.image(), 0, 0, null);// 继续捕获下一帧grabber.grabNext(frame);}// 停止捕获并释放资源grabber.stop();grabber.release();recorder.release();}}```## 4.总结本篇文章介绍了如何使用JavaCV调用摄像头方法。

javacv解码编码方式

javacv解码编码方式

javacv解码编码方式javacv是针对Java的开源计算机视觉库,它提供了一系列用于图像处理和计算机视觉任务的接口和函数。

其中包含了许多解码编码方式,用于实现图像和视频文件的编码和解码。

本文将介绍几种常见的javacv解码编码方式,并分析它们的特点和适用场景。

1. H.264编码和解码H.264是一种常见的视频编码标准,也被称为AVC(Advanced Video Coding)。

它通过压缩视频数据来减小文件大小,并提供了较高的图像质量。

javacv提供了H.264编码和解码的功能,可以通过使用它来处理H.264格式的视频文件。

H.264编码具有高压缩比和较低的带宽要求,适合在带宽有限的网络环境中传输和存储视频。

同时,H.264解码可以高效地解析H.264格式的视频文件,并将其转换为可供应用程序进一步处理的图像数据。

2. MPEG-4编码和解码MPEG-4是一种广泛应用于多媒体传输和存储的编码标准。

javacv提供了对MPEG-4编码和解码的支持,可以处理MPEG-4格式的图像和视频数据。

MPEG-4编码是一种可扩展的编码方式,它允许对视频进行高效的压缩,并支持各种图像和音频编码技术。

MPEG-4解码可以将MPEG-4格式的视频文件解析为图像和音频数据,并提供给应用程序进行进一步处理。

3. MJPEG编码和解码MJPEG(Motion-JPEG)是一种将视频压缩为JPEG格式的编码算法。

javacv支持MJPEG编码和解码,可以处理MJPEG格式的图像和视频数据。

MJPEG编码将每个视频帧压缩为独立的JPEG图像,这样可以减小文件的大小,并保持较高的图像质量。

MJPEG解码可以将MJPEG格式的视频文件解析为图像数据,并提供给应用程序进行处理。

4. VP8编码和解码VP8是一种开源的视频编码标准,通常在WebRTC和WebM视频中使用。

javacv提供了VP8编码和解码的支持,可以处理VP8格式的视频数据。

音视频编解码 文件格式 协议内容详解(2024精)

音视频编解码 文件格式 协议内容详解(2024精)

音视频编解码文件格式协议内容详解1. 引言在现代多媒体技术中,音视频编解码是一种重要的处理方式。

它将音频和视频信号转换为数字信息,以便在不同设备之间传输和存储。

而音视频文件格式则是用来存储这些数字信息的一种特殊格式。

在音视频传输和存储中,同时使用音频编解码器和视频编解码器来处理音视频数据,以实现高质量的音视频播放和传输。

2. 音频编解码音频编解码是将音频信号转换为数字数据的过程。

音频编码器将音频信号经过一系列算法处理,压缩成较小的数据包,再通过音频解码器进行解码。

常见的音频编解码算法有PCM、MP3、AAC等。

2.1 PCM(脉冲编码调制)PCM是一种广泛应用的音频编码算法,它将模拟音频信号转换为数字数据。

PCM采样音频信号,将其离散化,并进行量化处理,最后将结果存储为数字数据。

MP3是一种常用的有损音频编码算法,通过去除人耳无法察觉的音频信号细节,实现音频数据的压缩。

MP3编码算法在音频质量和存储空间之间进行权衡,适合在互联网输和存储音频文件。

2.3 AACAAC是一种高级音频编码算法,其压缩效率更高,并且质量更好。

AAC编码器能减小音频文件的大小,同时保持音频质量。

由于其高效性和广泛应用性,AAC成为音频文件的主流格式之一。

3. 视频编解码视频编解码是将视频信号转换为数字数据的过程。

视频编码器通过对视频信号进行采样、压缩和量化处理,将视频信号转换为数字数据。

在接收端,视频解码器将数字数据解码,并还原成视频信号进行播放。

3.1 H.264H.264是一种常用的视频编码标准,具有高压缩比和高质量的特点。

它能够提供更好的视频质量,同时减小视频文件的大小。

H.264广泛应用于视频通信、视频会议、流媒体等领域。

H.265是H.264的升级版视频编码标准,也被称为HEVC(High Efficiency VideoCoding)。

H.265相对于H.264可以提供更好的压缩效率,进一步减小视频文件的大小,同时保持高质量的视频播放。

  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,没有子类字段。

相关文档
最新文档