xuggler实现视频压缩

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

随着Internet中视频的爆炸性增长,开发人员经常需要在其应用程序中操纵视频内容。 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

xuggler实现视频压缩

xuggler实现视频压缩_Xuggler视频处理简介相关推荐

  1. xuggler 中文开发_Xuggler开发教程

    xuggler 中文开发 大家好, 在这篇文章中,我想介绍JavaCodeGeeks上的一些很酷的新教程. 他们将讨论与Xuggler , FFmpeg和Wowza进行媒体(音频/视频)操纵的方式. ...

  2. 视频色彩校正简介 Introduction to Video Color Correction

    视频色彩校正简介 Introduction to Video Color Correction 视频色彩校正简介 Introduction to Video Color Correction MP4 ...

  3. 深度学习与视频分析简介

    文章大纲 视频分析简介 视频理解 方法与技术 技术优势 重要技术罗列 目标检测 帧差法 使用深度学习进行视频分析 视频分析中的目标检测 架构 系统逻辑架构 典型应用场景 5G 工序检测 工业质量控制 ...

  4. 日常技巧之使用FFmpeg进行快速视频压缩和视频片段截取

    1 引言 最近由于工作需要,做了很多汇报材料.为了展示算法效果,大多神经网络开发人员都直接将模型跑出来的结果做成视频,但是生成的视频文件往往很大,在PPT插入时显得异常臃肿,真让人脑壳大 >_& ...

  5. MPEG2视频编码简介

    MPEG-2视频编码简介 MPEG-2是一组用于视音频压缩编码及其数据流封装的国际标准.它定义了编解码技术及数据流的传输协议:制定了MPEG-2解码器之间的共同标准.编码是MPEG-2标准的核心内容之 ...

  6. Xuggler视频处理简介

    注意:这是我们的" Xuggler开发教程 "系列的一部分. 随着互联网上视频的爆炸式增长,开发人员经常需要在其应用程序中操纵视频内容. Xuggler是Java开发人员的免费开放 ...

  7. java视频流传输_java – 使用Xuggler流式传输视频

    我能够使用下面的代码成功地与Xuggler一起播放视频.我需要能够从inputStream而不是文件流.我尝试使用注释掉的代码来创建一个Icontainer.当我注释掉代码时,我确实修改了getTes ...

  8. 数据分析展示B站UP主假吃强(Cram阿强)的面目-视频与简介篇

    相关文章 数据分析展示B站UP主假吃强(Cram阿强)的面目-评论篇 文章目录 相关文章 一.获取数据 二.数据分析 字云图 词云图 强势四联 还有一张?在垃圾桶里 一.获取数据 上次写了篇爬取假吃强 ...

  9. 市场上流行的视频格式 简介

    1.CAM(枪版)--珍爱生命,远离枪版 CAM通常是用数码摄像机从电影院盗录.有时会使用小三角架,但大多数时候不可能使用,所以摄像机会抖动.因此我们看到画面通常偏暗人物常常会失真,下方的字幕时常会出 ...

最新文章

  1. 卧槽,面试官质疑我不会配置中心原理,看不起谁呢?
  2. 0046算法笔记——【随机化算法】舍伍德随机化思想解决跳跃表问题
  3. 装运点确认失败的排查
  4. 从源码深处体验Spring核心技术--基于Xml的IOC容器的初始化
  5. flink运行原理_浅谈Flink分布式运行时和数据流图的并行化
  6. UML图入门学习笔记
  7. php简单记账本_代理记账的三种方式
  8. Qt Dialog捕捉鼠标移动事件
  9. 扫地机器人水箱背景_你真的懂扫地机器人吗?这些不为人知的小细节值得一看...
  10. 基于多模态常规技术的芒果叶片病害识别新模型
  11. 打乱一个排好序的 list 对象 alist?
  12. 天锐绿盾屏幕水印追溯设置,精准追踪文档流转
  13. 美国节点服务器有什么优势,美国CN2服务器的概念与优势
  14. mysql中查询编辑器_万能数据库查看器|Universal SQL Editor(万能SQL编辑器)下载 v1.8 官方版 - 比克尔下载...
  15. 机房服务器配置方案文件,机房改造/机房搬迁实施方案及步骤
  16. sht20中写用户寄存器_谁用过sht20这块温湿度传感器,有调通的程序分享下吧
  17. 个人知乎 ##功能一-登录注册
  18. Cache的Insert 和Add 方法引发的血案
  19. 怎么把PDF图片转换成PPT
  20. x264 2pass编码说明

热门文章

  1. java中常见的几种内部类,你会几个?(未完)
  2. 《走遍中国》珍藏版(二)
  3. 《四世同堂》金句摘抄(十七)
  4. 新闻发布项目——实体类(comment)
  5. css实现一级下拉菜单
  6. 19年8月 字母哥 第四章 常用web开发数据库框架 不要用公司网络加载不出来 用热点!!!
  7. mysql级联复制转换成一主两从_一主两从转级联复制
  8. 405: HTTP method GET is not supported by this URL
  9. php cdi_CDI中的事务异常处理
  10. java单例枚举_Java增强枚举的用例