Xuggler视频处理简介

注意:这是我们的“ Xuggler开发教程 ”系列的一部分。

随着互联网上视频的爆炸式增长,开发人员经常需要在其应用程序中操纵视频内容。 Xuggler是Java开发人员的免费开放源代码库,可用于实时解压缩,处理和压缩录制的视频或实时视频。 Xuggler在后台使用了功能非常强大的FFmpeg媒体处理库,实际上在它们周围扮演着Java包装器的角色。 这是从Java解压缩,修改和重新压缩任何媒体文件(或流)的简单方法。

FFmpeg是一个完整的跨平台解决方案,用于记录,转换和流式传输音频和视频,并支持多种格式。 即使您不知道它,也很可能已经在计算机上使用它。 但是,Xuggler的用途不仅限于提供对复杂FFmpeg本机库的轻松访问。 Xuggler开发团队还不断对FFmpeg进行改进。 您可以在Xuggle博客上找到最新消息,该博客中还发布了许多教程。 千万不要错过这些家伙的过分简单的互联网视频指南 。

让我们继续获取FFmpeg。 请注意,Xuggler带有自己的(改进的)FFmpeg版本,以避免配置错误,因此您不必手动获取FFmpeg。 在此过程中,我们将在将控制权交给Xuggler之前直接使用FFmpeg进行一些测试,因此您可能希望将原始版本作为单独的可执行文件使用。

转到FFmpeg下载页面并获取最新发行版,当时的版本为0.6.1。 对于Linux,您可以从tarball下载源代码并继续进行编译。 在Windows中,您可能应该获得预编译的二进制文件。 我使用了Mplayer-win32提供的一个,可以从这里获得。 您将在此处找到ffmpeg.exe可执行文件。 将其复制到一个特定的文件夹中,我选择“ C:\ programs \ ffmpeg”,如果不想每次都写完整的路径,可以选择将ffmpeg.exe添加到系统路径中。

要测试可执行文件是否正常工作,请打开终端并在不带参数的情况下运行它。 您应该看到类似于以下的输出:

FFmpeg版本SVN-r21231-Sherpya,版权所有(c)2000-2010 Fabrice Bellard等。
建于2010年1月16日05:42:31与gcc 4.2.5 20080919(预发行)[Sherpya] libavutil 50. 7. 0 / 50. 7. 0
libavcodec 52.47。 0 / 52.47。 0
libavformat 52.47。 0 / 52.47。 0
libavdevice 52. 2. 0 / 52. 2. 0
libavfilter 1.15。 0 / 1.15。 0
libswscale 0. 8. 0 / 0. 8. 0
libpostproc 51. 2. 0 / 51. 2. 0
超快速音频和视频编码器
用法:ffmpeg [选项] [[infile选项] -i infile]…{[outfile选项] outfile}…

使用-h获得完整的帮助,或者甚至更好地运行'man ffmpeg'

您也可以使用输出建议的“ -h”开关来接收一堆冗长的参数和选项。 最好查看在线FFmpeg文档 。

下一步是对您的第一个视频进行转码 ,可能是从预录制的文件中转码 。 我的输入文件是一个4分钟20秒长的MP4视频,大小为18.1MB,称为“ myvideo.mp4”。 我想将其转换为Flash视频,从而大大降低其质量。 使用FFmpeg可以很容易地通过发出以下命令来完成此操作(注意对路径使用正斜杠):

ffmpeg.exe -i C:/myvideo.mp4 C:/myvideo.flv

控制台输出如下所示:

FFmpeg版本SVN-r21231-Sherpya,版权所有(c)2000-2010 Fabrice Bellard等。
建于2010年1月16日05:42:31与gcc 4.2.5 20080919(预发行)[Sherpya] libavutil 50. 7. 0 / 50. 7. 0
libavcodec 52.47。 0 / 52.47。 0
libavformat 52.47。 0 / 52.47。 0
libavdevice 52. 2. 0 / 52. 2. 0
libavfilter 1.15。 0 / 1.15。 0
libswscale 0. 8. 0 / 0. 8. 0
libpostproc 51. 2. 0 / 51. 2. 0

似乎流1编解码器的帧速率与容器的帧速率不同:59.92(14981/250)-> 29.96(14981/500)
从'C:/myvideo.mp4'输入#0,mov,mp4,m4a,3gp,3g2,mj2:
元数据: major_brand:mp42 minor_version:0 兼容品牌:isomavc1mp42 持续时间:00:04:20.96,开始:0.000000,比特率:582 kb / s 流#0.0(und):音频:aac,44100 Hz,立体声,s16、115 kb / s 流#0.1(und):视频:h264,yuv420p,480×270 [PAR 1:1 DAR 16:9],464 kb / s,29.96 fps,29.96 tbr,29962 tbn,59.92 tbc 输出#0 flv到'C:/myvideo.flv': 流#0.0(und):视频:flv,yuv420p,480×270 [PAR 1:1 DAR 16:9],q = 2-31,200 kb / s,1k tbn,29.96 tbc 流#0.1(und):音频:libmp3lame,44100 Hz,立体声,s16,64 kb / s 流映射: 流#0.1->#0.0 流#0.0->#0.1 按[q]停止编码 [libmp3lame @ 0038f3a0] lame:输出缓冲区太小(缓冲区索引:9404,可用字节:388) 音频编码失败

忽略“音频编码失败”消息,没有错误。 结果是一个不错的,可播放的FLV文件,名为“ myvideo.flv”,大小为10.1MB。

太酷了,让我们继续安装Xuggler。 首先,我们从Xuggler下载页面获取最新版本。 如此处所述:

Xuggler由两个主要部分组成; 一组Java jar文件和一组本机共享库(Windows上的.dll文件,Linux上的.so文件或Mac上的.dylib文件)。 要使用它,您需要先安装本机库,然后才能编写使用Xuggler的程序。

确保下载与操作系统的体系结构和Java版本匹配的正确文件。 例如,我下载了Windows的32位(对于Windows没有64位),Java 1.5或更高版本,它基本上是一个安装程序。

您可以在下载页面中找到有关如何安装本机库的说明。 对于Windows,您可以卸载任何以前的版本,然后运行安装程序,当然还要重新启动计算机 。 还有一个视频介绍了如何在Microsoft Windows上安装Xuggler 。 重新启动后,让我们测试安装是否成功。 首先,我们检查Xuggle路径变量是否已设置:

C:\>回声%XUGGLE_HOME%
C:\ Program档案(x86)\ Xuggle

路径已正确设置。 请注意,Xuggler FFmpeg可执行文件位于“%XUGGLE_HOME%/ bin”文件夹中。

让我们通过发出以下命令来播放我们的第一个视频(将“ c:/myvideo.mp4”替换为您的文件):

java -cp“%XUGGLE_HOME%\ share \ java \ jars \ xuggle-xuggler.jar” com.xuggle.xuggler.demos.DecodeAndPlayVideo c:/myvideo.mp4

是时候使用Xuggler编写我们的第一个代码了。 我们将检查视频文件,找到其媒体容器,并打印出内容摘要。 同时,将Xuggle API Javadocs加入书签,以备将来参考。

启动您喜欢的IDE,创建一个新项目,然后导入在“%XUGGLE_HOME%/ share / java / jars”文件夹中找到的所有JAR文件。 该示例类似于如何在Eclipse中编写您的第一个Xuggler应用程序一文中提供的示例。

package com.javacodegeeks.xuggler.intro;import com.xuggle.xuggler.ICodec;
import com.xuggle.xuggler.IContainer;
import com.xuggle.xuggler.IStream;
import com.xuggle.xuggler.IStreamCoder;public class VideoInfo {private static final String filename = "c:/myvideo.mp4";public static void main(String[] args) {// first we create a Xuggler container objectIContainer container = IContainer.make();// we attempt to open up the containerint result = container.open(filename, IContainer.Type.READ, null);// check if the operation was successfulif (result<0)throw new RuntimeException("Failed to open media file");// query how many streams the call to open foundint numStreams = container.getNumStreams();// query for the total durationlong duration = container.getDuration();// query for the file sizelong fileSize = container.getFileSize();// query for the bit ratelong bitRate = container.getBitRate();System.out.println("Number of streams: " + numStreams);System.out.println("Duration (ms): " + duration);System.out.println("File Size (bytes): " + fileSize);System.out.println("Bit Rate: " + bitRate);// iterate through the streams to print their meta datafor (int i=0; i<numStreams; i++) {// find the stream objectIStream stream = container.getStream(i);// get the pre-configured decoder that can decode this stream;IStreamCoder coder = stream.getStreamCoder();System.out.println("*** Start of Stream Info ***");System.out.printf("stream %d: ", i);System.out.printf("type: %s; ", coder.getCodecType());System.out.printf("codec: %s; ", coder.getCodecID());System.out.printf("duration: %s; ", stream.getDuration());System.out.printf("start time: %s; ", container.getStartTime());System.out.printf("timebase: %d/%d; ",stream.getTimeBase().getNumerator(),stream.getTimeBase().getDenominator());System.out.printf("coder tb: %d/%d; ",coder.getTimeBase().getNumerator(),coder.getTimeBase().getDenominator());System.out.println();if (coder.getCodecType() == ICodec.Type.CODEC_TYPE_AUDIO) {System.out.printf("sample rate: %d; ", coder.getSampleRate());System.out.printf("channels: %d; ", coder.getChannels());System.out.printf("format: %s", coder.getSampleFormat());} else if (coder.getCodecType() == ICodec.Type.CODEC_TYPE_VIDEO) {System.out.printf("width: %d; ", coder.getWidth());System.out.printf("height: %d; ", coder.getHeight());System.out.printf("format: %s; ", coder.getPixelType());System.out.printf("frame-rate: %5.2f; ", coder.getFrameRate().getDouble());}System.out.println();System.out.println("*** End of Stream Info ***");}}}

我们首先获得一个IContainer实例,该实例是一个数据源,其中包含一个或多个音频和视频数据流。 然后,我们尝试打开媒体文件并使其可供读取。 如果操作成功,我们可以轻松地检索信息,例如包含的流数 , 总持续时间 , 文件大小和比特率 。

请注意,此信息响应容器本身。 但是,我们可以获得有关容器组成的各个流的元数据。 我们使用getStream方法来引用相应的流,然后使用IstreamCoder(它是可以解码特定流的解码器)。 从该对象中,我们可以找到流的编解码器类型 , 编解码器ID和其他信息。

最后,我们能够区分音频和视频流。 对于音频流,我们可以找到使用的采样率 , 通道数和音频采样格式 。 同样,对于视频流,我们可以获得尺寸( 宽度和高度 ), 像素格式和帧频 。

样本输出如下所示:

流数:2
持续时间(毫秒):260963888
档案大小(位元组):19007074
比特率:582672
***流信息开始***
流0:类型:CODEC_TYPE_AUDIO; 编解码器:CODEC_ID_AAC; 持续时间:11507712; 开始时间:0; 时基:1/44100; 编码器tb:1/44100;
采样率:44100; 频道:2; 格式:FMT_S16
***流信息结束***
***流信息开始***
流1:类型:CODEC_TYPE_VIDEO; 编解码器:CODEC_ID_H264; 持续时间:7819000; 开始时间:0; 时基:1/29962; 编码器tb:250/14981;
宽度:480; 高度:270; 格式:YUV420P; 帧频:29.96;
***流信息结束***

伙计们。 Xuggler的视频处理软件简介。 与往常一样,您可以下载为本教程创建的Eclipse项目 。

在接下来的教程中,我将向您展示Xuggler和FFmpeg可以完成的一些更酷的工作,例如视频转换和修改。 因此,请继续关注JavaCodeGeeks ! 别忘了分享!

相关文章:

  • 使用wowza和xuggler将RTMP转换为RTSP
  • Xuggler教程:转码和媒体修改
  • Xuggler教程:帧捕获和视频创建
  • 使用VirtualBox在PC上安装Android OS

翻译自: https://www.javacodegeeks.com/2011/02/introduction-xuggler-video-manipulation.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/374939.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件测试中条件覆盖,路径覆盖,语句覆盖,分支覆盖的区别

转&#xff1a;软件测试中条件覆盖&#xff0c;路径覆盖&#xff0c;语句覆盖&#xff0c;分支覆盖的区别 举个例子吧 if A and B then Action1 if C or D then Action2 语句覆盖最弱&#xff0c;只需要让程序中的语句都执行一遍即可 …

Spring_讲解

http://s&#xff0c;i&#xff0c;s&#xff0c;h&#xff0c;u&#xff0c;o&#xff0c;k.com/forum/blogPost/list/6174.html转载于:https://www.cnblogs.com/gisblogs/p/4579162.html

使用Spring AspectJ和Maven进行面向方面的编程

Spring框架附带AOP支持。 实际上&#xff0c;如Spring参考文档中所述 &#xff0c; “ Spring的关键组件之一是AOP框架。 尽管Spring IoC容器不依赖于AOP&#xff0c;这意味着您不需要使用AOP&#xff0c;但AOP是对Spring IoC的补充&#xff0c;以提供功能强大的中间件解决方案…

hadoop5--mapreduce设计模式

运行结果附图 本节课程主要内容为学习MapReduc设计模式&#xff0c;并编写java程序对日志文件进行处理。 课本上介绍的MapReduce的设计模式主要包含:计数(Counting),分类(Classification),过滤处理(Filtering),排序(Sorting),去重计数(Distinct Counting),相关计数(Cross-Corre…

ES5中新增的Array方法详细说明

http://www.zhangxinxu.com/wordpress/2013/04/es5%E6%96%B0%E5%A2%9E%E6%95%B0%E7%BB%84%E6%96%B9%E6%B3%95/转载于:https://www.cnblogs.com/lmw425317/p/5339539.html

jqGrid,REST,AJAX和Spring MVC集成

两年多以前&#xff0c;我写了一篇关于两个如何在Struts2中实现优雅的CRUD的文章。 实际上&#xff0c;我必须就该主题写两篇文章&#xff0c;因为该主题如此广泛。 今天&#xff0c;我采用了一套更为流行的&#xff0c;完善的框架和库&#xff0c;采用了更为轻量级的现代方法。…

Java-马士兵设计模式学习笔记-代理模式--动态代理 修改成可以代理任意接口

一、概述 1.目标&#xff1a;把Proxy修改成可以代理任意接口及其任意方法 2.思路&#xff1a; (1)代理任意接口&#xff1a;把接口类型作为参数传给Proxy的newProxyInstance(Class interfze) (2)代理任意方法&#xff1a;用interfze.getMethods()取出所有方法&#xff0c;拼接实…

PTA习题

PTA习题 PTA浙大版《C语言程序设计&#xff08;第3版&#xff09;》 题目集5-6 水仙花数是指一个N位正整数&#xff08;N≥3&#xff09;&#xff0c;它的每个位上的数字的N次幂之和等于它本身。 本题要求编写两个函数&#xff0c;一个判断给定整数是否水仙花数&#xff0c;…

acdream 1409 Musical 状压DP

链接&#xff1a;http://acdream.info/problem?pid1409 题意&#xff1a;整个国家有n座城市&#xff0c;每座城市有三种粉丝。 第一种一周看一场音乐剧&#xff0c;挑选的音乐剧是已经在周围城市播放上演过的次数最多的音乐剧中的随机一个。 另外一种每天看一场音乐剧&#xf…

真正的模块化Web应用程序:为什么没有开发标准?

OSGI &#xff0c; SpringSource &#xff0c; Jboss模块 &#xff0c;J2EE和清单永远不会结束。所有这些技术都向他们的最终用户/开发人员保证了相同的东西&#xff0c;或多或少是Java模块化Web应用程序&#xff08;&#xff1f;&#xff09;。 但是&#xff0c;我们当中有多少…

C语言5-7习题

本题要求实现一个函数&#xff0c;用下列公式求cos(x)的近似值&#xff0c;精确到最后一项的绝对值小于e&#xff1a; #include <stdio.h> #include <math.h>double funcos( double e, double x );int main() { double e, x;scanf("%lf %lf", &…

JDBC批处理executeBatch

JDBC运行SQL声明&#xff0c;有两个处理接口&#xff0c;一PreparedStatement,Statement,一般程序JDBC有多少仍然比较PreparedStatement 只要运行批处理&#xff0c;PreparedStatement少一点Statement ps conn.prepareStatement(sql); for(int i 0;i<10;i){ ps.setString(…

BC div2补题以及 复习模除 逆元__BestCoder Round #78 (div.2)

第一题没话说 智商欠费 加老柴辅导终于过了 需要在意的是数据范围为2的63次方-1 三个数相加肯定爆了 四边形的定义  任意边小于其余三边之和 换句话说就是  最长边小于其余三边之和 这样的话问题转化为 最长边依次减其余三边的结果是否小于等于0 还有一点是题目出现0边 即最…

习题6-1 分类统计字符个数 (15 分)

本题要求实现一个函数&#xff0c;统计给定字符串中英文字母、空格或回车、数字字符和其他字符的个数。 函数接口定义&#xff1a; void StringCount( char s[] );其中 char s[] 是用户传入的字符串。函数StringCount须在一行内按照 letter 英文字母个数, blank 空格或回车…

Servlet 3.0异步处理可将服务器吞吐量提高十倍

Servlet是Java中处理服务器端逻辑的主要组件&#xff0c;新的3.0规范引入了一些非常有趣的功能&#xff0c;其中异步处理是最重要的功能之一。 可以利用异步处理来开发高度可伸缩的Web应用程序。 使用此功能可以有效地构建Web 2.0站点和AJAX应用程序。 我们的JCG合作伙伴之一To…

使用secureCRT连接VMware-Ubuntukylin虚拟机

使用SecureCRT连接VMware时总是提醒主机拒绝连接。这时可以使用sudo apt-get install openssh-server openssh-client&#xff0c;在主机上安装ssh. 安装成功后&#xff0c;可以连接到主机了。 如果显示远程主机拒绝连接。则可以使用如下方法。 VMware里面装的是Ubuntukylin版本…

加载音频Audio

var cameraAudio new Audio(); cameraAudio.src camera.wav;// 设置音频对象的属性,预加载视频 var options_audio { preload : auto } for(var key in options_audio){ if(options_audio.hasOwnProperty(key) && (key in cameraAudio)){ cameraAudio[key] opti…

习题6-2 使用函数求特殊a串数列和 (20 分)

给定两个均不超过9的正整数a和n&#xff0c;要求编写函数求aaaaaa⋯aa⋯a&#xff08;n个a&#xff09;之和。 int fn( int a, int n ); int SumA( int a, int n );其中函数fn须返回的是n个a组成的数字&#xff1b;SumA返回要求的和。 我的代码&#xff1a; int fn( int a, i…

Java中可怕的双重检查锁定成语

本文讨论的问题不是新问题&#xff0c;但即使是经验丰富的开发人员也仍然很棘手。 单例模式是常见的编程习惯。 但是&#xff0c;当与多个线程一起使用时&#xff0c;必须进行某种类型的同步&#xff0c;以免破坏代码。 Khangaonkar报告中的 JCG合作伙伴Manoj Khangaonkar在一篇…

国内有哪些好的刷题网站?

http://www.zhihu.com/question/25574458 Luau Lawrence&#xff0c;Data Mining 弱鸡 / PhDNTU 温梦强、石一帆、知乎用户 等人赞同 - Welcome To PKU JudgeOnline 北京大学的Online Judge。POJ上面的题目有点老了&#xff0c;但好处是做的人多&#xff0c;经典算法题多&…