如何在Java JVM中处理图像和视频

在Java JVM中处理图像(更不用说视频)一直是一项艰巨的任务。 自JDK7以来, ImageIO类已经走了很长一段路,再加上常见的SDK错误,并不总是能给您您所期望的(图像质量差,不总是支持所有类型的JPEG标准,…)。 在这行的最后,最好使用专门为图像处理编写的开源库,例如ImageMagick和GraphicsMagick。 这些库也是我们在ImageServer跨模块中使用的库,用于为图像,PDF等生成缩略图和变体。

最近,我们参与了一个项目,在该项目中,我们不得不显示和播放客户上传的音频/视频文件。 该页面还显示了媒体资产中的一些元数据,文件在上传后将被拒绝(例如,如果比特率或其他元数据不足)。 简而言之,我们必须解析各种音频和视频资产的元数据,然后将此媒体文件呈现给客户。 我们这里不是在谈论Netflix流媒体平台,而是一些基本的音频/视频流媒体。

我们寻找的库可以解析视频文件(在本例中,我们正在谈论MXF文件)以提取元数据。 有类似Netflix Photon( https://github.com/Netflix/photon/releases )和https://github.com/jforaci/mxf-reader的库 。 但是,您真的要在JVM中解析和读取文件吗? 简短的答案是“不”,您不希望所有这些东西都进入Java内存。

那有什么选择呢?

元数据解析

为此,我们研究了ffmpeg和MediaInfo。

如果您曾经将自己的(S)VCD,DVD磁盘转换为MKV(Matroska容器)或AVI,MPEG格式,那么您肯定会注意到ffmpeg是用于转换/解析媒体文件的事实上的工具。

MediaInfo是客户建议的工具,可从媒体文件提供结构化的元数据探测。

我们编写的解析器支持ffmpeg和Mediainfo的灵活性,并将这些工具中的JSON映射到相同的数据结构。 两者给出相似的输出

ffmpeg探针

$ ffprobe -show_format -show_streams audiocheck.net_polarity_guitarOK.wav -print_format json -loglevel 0
{"streams": [{"index": 0,"codec_name": "pcm_s16le","codec_long_name": "PCM signed 16-bit little-endian","codec_type": "audio","codec_time_base": "1/44100","codec_tag_string": "[1][0][0][0]","codec_tag": "0x0001","sample_fmt": "s16","sample_rate": "44100","channels": 2,"bits_per_sample": 16,"r_frame_rate": "0/0","avg_frame_rate": "0/0","time_base": "1/44100","duration_ts": 224041,"duration": "5.080295","bit_rate": "1411200","disposition": {"default": 0,"dub": 0,"original": 0,"comment": 0,"lyrics": 0,"karaoke": 0,"forced": 0,"hearing_impaired": 0,"visual_impaired": 0,"clean_effects": 0,"attached_pic": 0,"timed_thumbnails": 0}}],"format": {"filename": "audiocheck.net_polarity_guitarOK.wav","nb_streams": 1,"nb_programs": 0,"format_name": "wav","format_long_name": "WAV / WAVE (Waveform Audio)","duration": "5.080295","size": "896208","bit_rate": "1411269","probe_score": 99}
}
$ mediainfo --output=JSON audiocheck.net_polarity_guitarOK.wav
{
"media": {
"@ref": "audiocheck.net_polarity_guitarOK.wav",
"track": [
{
"@type": "General",
"AudioCount": "1",
"FileExtension": "wav",
"Format": "Wave",
"FileSize": "896208",
"Duration": "5.080",
"OverallBitRate_Mode": "CBR",
"OverallBitRate": "1411351",
"StreamSize": "44",
"File_Modified_Date": "UTC 2020-03-03 12:02:30",
"File_Modified_Date_Local": "2020-03-03 13:02:30"
},
{
"@type": "Audio",
"Format": "PCM",
"Format_Settings_Endianness": "Little",
"Format_Settings_Sign": "Signed",
"CodecID": "1",
"Duration": "5.080",
"BitRate_Mode": "CBR",
"BitRate": "1411200",
"Channels": "2",
"SamplingRate": "44100",
"SamplingCount": "224028",
"BitDepth": "16",
"StreamSize": "896164",
"StreamSize_Proportion": "0.99995"
}
]
}
}

请注意,如果您使用的是Debian常规安装,则需要从https://mediaarea.net/zh-CN/MediaInfo/Download/Debian安装.deb软件包–否则,您将被(非常)旧版本所困扰,该版本具有没有JSON输出。

将这些输出包装到一个通用的数据结构中足以完成我们的元数据处理检查并存储一些元数据以用于显示(例如,媒体文件的持续时间和格式)。

缩图产生

对于缩略图的生成,有两个要求。 音频文件必须生成波形。 视频文件必须为该视频生成良好的缩略图。

根据上面的元数据,您可以快速区分上传的媒体文件是音频文件还是视频文件(视频文件具有视频流/轨道)。

两者都遵循另一条缩略图生成轨道。

音频缩略图生成和音频播放

要在概览页面上显示波形,我们只需使用ffmpeg使用以下命令生成波形

$ ffmpeg -y -i inputfile -filter_complex "showwavespic=colors=#007bff:split_channels=1" -frames:v 1 -c:v png -loglevel -8

这将生成PNG格式的波形,并拆分波形中的不同音频通道。 生成此图像后,我们将其上传到我们的Across ImageServer。

在音频资产的详细信息页面上,我们使用WaveSurfer( https://wavesurfer-js.org/ )播放音频文件并渲染音频通道-那里没什么特别的。

视频缩略图生成和视频播放

要在概述页面上显示缩略图,我们可以使用ffmpeg缩略图过滤器

$ ffmpeg -i inputFile -vf "thumbnail" -frames:v 1

该过滤器非常适合于对优质缩略图进行评价。 您可以做更多更有趣的事情,例如

$ ffmpeg -ss 3 -i inputFile -vf "select=gt(scene\,0.5)" -frames:v 5 -vsync vfr out%02d.png

这将生成5个缩略图帧,从一开始就跳过3秒钟(可能是字幕),并抓取“场景变化”大于50%的帧。 为此,在https://superuser.com/questions/538112/含义ful-thumbnails- for-a-video-using- ffmpeg进行了很好的讨论。

最终,客户认为最后一个第二帧将是最适合他们的目的的,因为该帧通常包含商业视频的闭包。

由于视频为25fps,我们最终得到的命令如下(其中89是帧总数– 26 )。 是的,26…因为ffmpeg对帧进行从零开始的计数。

$ ffmpeg -i inputFile -vf "select=gte(n\,89)" -frames:v 1

然后将生成的缩略图上传到ImageServer中,仅此而已。 现在...播放视频文件...

嗯,网络上的视频播放器不支持MXF文件,最好的选择是将该视频容器格式转码为MP4(这是当今最兼容的跨浏览器格式)。

幸运的是,ffmpeg可以解救,尽管要找到合适的命令来生成可在大多数浏览器中播放的MP4的命令可能具有挑战性。

$ ffmpeg -y -i inputFile -vcodec libx264 -pix_fmt yuv420p -profile:v baseline -level 3 transcodedFile

此命令生成具有基线配置文件和YUV420P颜色编码方案的MP4文件。 此基准配置文件和配色方案可确保在Safari(适用于Mac)上正确显示。

使用Across FileRepositoryModule将转码后的文件存储在后备存储(在这种情况下为Azure BLOB存储,但它也支持AWS S3或本地存储)。

现在...真正播放视频文件...

我们需要网络上的视频播放器来实现这一目标。 最常见的库是videojs( https://videojs.com/ ),该库易于设置且可自定义,足以满足我们的目的。

仅向<video>标签提供正确的url即可在Firefox和Chrome中立即产生结果,但是Safari顽固地播放该文件。

Safari尝试通过将范围标头添加到HTTP请求中,从而与其他苹果产品一样变得与众不同。 这是为了避免一次通过网络发送视频文件中的所有字节。

取而代之的是HTTP Range标头指定需要获取的字节范围。

使用Spring Boot中的ResourceRegion构造可以轻松完成此操作,以下博客对此有所帮助: https : //melgenek.github.io/spring-video-service

最后,安装程序能够:

  • 从任何媒体文件中提取元数据
  • 生成媒体文件的缩略图(音频波形和视频缩略图)
  • 通过Wavesurfer播放音频文件
  • 通过VideoJS播放视频文件

翻译自: https://www.javacodegeeks.com/2020/04/how-to-process-images-and-videos-within-java-jvm.html

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

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

相关文章

手机怎么进ph_明日发布,华为鸿蒙OS2.0手机版特色功能曝光

阅读本文前&#xff0c;请您先点击上面的蓝色字体&#xff0c;再点击“关注”&#xff0c;这样您就可以免费收到最新内容了。每天都有分享&#xff0c;完全是免费订阅&#xff0c;请放心关注。声明&#xff1a;本文转载自网络&#xff0c;如有侵权&#xff0c;请在后台留言联系…

清华大学 张春良 计算机系,南京张春良老师小学生信息学辅导

南师大张老师信息编程师资团队小学信息学的教学如今小学生对计算机的兴趣越来越强&#xff0c;使用计算机的时间也越来越多。许多聪慧的孩子无意之间&#xff0c;为追求控制感、成功感&#xff0c;沉溺进了电脑游戏&#xff0c;令家长、教师扼腕叹息。信息学培训&#xff0c;引…

json 在后天怎么接_长相显老怎么办?以同岁的马伊琍和刘敏涛为例,解析显年轻的技巧...

短发女王马伊琍和最近上热搜的刘敏涛都是1976年出生&#xff0c;今年44岁&#xff0c;但是当两人同框时&#xff0c;即使相同的脸型和服饰&#xff0c;马伊琍显得很年轻&#xff0c;而刘敏涛却像是隔代人&#xff0c;真的好尴尬。这是什么原因呢&#xff1f;其实她们的尴尬&…

java8 streams_当Java 8 Streams API不够用时

java8 streamsJava 8与往常一样是妥协和向后兼容的版本。 JSR-335专家组可能尚未与某些读者就某些功能的范围或可行性达成一致的版本 。 请参阅Brian Goetz关于为什么…的一些具体解释。 …Java 8默认方法中不允许“最终” …Java 8默认方法中不允许“同步” 但是今天&#…

计算机软考初级工程资料,计算机软考网络工程师复习资料及习题(一)

1、 若是serial0 is up, line protocol is up表示该端口工作正常。2、若是serial 0 is down, line protocol is down表示路由器到本地的modem之间无载波信号cd。连接串口和 modem,开启modem.看modem的发送灯td是否亮&#xff0c;td灯亮表示路由器有信号发送给modem.td灯若不亮,…

计算机硬盘瓶颈,为何你的电脑卡的飞起,看看是不是遇到存储瓶颈

原标题&#xff1a;为何你的电脑卡的飞起&#xff0c;看看是不是遇到存储瓶颈存储一直是笔记本电脑的性能瓶颈之一&#xff0c;同时还关系到电池续航时间。除了一颗性能澎湃的处理器之外&#xff0c;更多人困惑的是硬盘存储配置的选择。硬盘不仅有容量属性&#xff0c;更是影响…

JMetro版本8.6.11和11.6.11已发布

你好 JMetro的另一个版本。 这次已重新设置了2个新控件的样式&#xff0c;错误修复和其他一些小的调整。 我希望你们在这个陌生的时代都能安然无well。 继续阅读以获取详细信息。 新的ColorPicker样式 以下是新的ColorPicker样式LIGHT和DARK的动画&#xff1a; ColorPicker…

c#中overlord实例_具有Overlord的WildFly 8.1中的API管理

c#中overlord实例昨天&#xff0c;我简要介绍了霸王项目家族。 今天是时候进行试驾了。 API管理子项目两天前发布了1.0.0.Alpha1&#xff0c;并根据18个月的路线图介绍了第一组功能。 APIMan到底是什么&#xff1f; 它是一个API管理系统&#xff0c;可以嵌入到现有框架或应用程…

计算机病毒需要附着在,计算机病毒是如何传播的?

满意答案Fixedburn2019.10.24采纳率&#xff1a;53% 等级&#xff1a;8已帮助&#xff1a;7262人1、各种网络传播(1)电子邮件电子邮件是病毒通过互联网进行传播的主要媒介。病毒主要依附在邮件的附件中&#xff0c;而电子邮件本身并不产生病毒。当用户下载附件时&#xff0c…

使用适用于Java 2的AWS开发工具包的AWS DynamoDB版本字段

将任何实体上的版本属性保存到 AWS DynamoDB数据库&#xff0c;它仅是表示实体已修改次数的数字表示。 首次创建实体时&#xff0c;可以将其设置为1&#xff0c;然后在每次更新时递增。 好处是立竿见影的-指示实体已被修改的次数&#xff0c;可用于审核实体。 此外&#xff0…

51单片机有几个通用io口_51单片机IO口的四种使用方法

原标题:51单片机IO口的四种使用方法 传统51单片机IO接口只可以作为标准双向IO接口,如果用其来驱动LED只能用灌电流的方式或是用三极管外扩驱动电路。 灌电流方式 LED正极接VCC,负极接IO口。IO为高电平是LED两极电平相同,没有电流,LED熄灭;IO为低电平时,电流从VCC流入IO,…

win7计算机个性化设置,笔记本电脑windows7系统如何用好电脑个性化设置

笔记本电脑windows7系统想要用好电脑个性化设置&#xff0c;该怎么办呢&#xff0c;下面是学习啦小编收集整理的笔记本电脑windows7系统如何用好电脑个性化设置&#xff0c;希望对大家有帮助~~笔记本电脑windows7系统用好电脑个性化设置的方法右击桌面空白区域&#xff0c;在弹…

ARM AArch64的TrustZone架构详解(上)

目录 一、概述 1.1 在开始之前 二、什么是TrustZone? 2.1 Armv8-M的TrustZone 2.2 Armv9-A Realm Management Extension(RME)

junit测试报告生成_这是东西:jUnit:动态测试生成

junit测试报告生成当您需要在许多不同的输入值或配置上运行同一组测试时&#xff0c;动态测试生成很有用。 可以使用参数化测试或使用理论来实现。 当您有大量数据用作参数并想对所有组合进行测试时&#xff0c;这些理论非常有用。 您得到的控制较少&#xff0c;但不必自己编写…

发动机冷启动和热启动的区别_「牛车实验室」AGM自动启停蓄电池解读 和普通蓄电池到底有什么区别...

[资讯-牛车网]为了节省燃油&#xff0c;越来越多的新车搭载了自动启停功能。搭载了这项功能的汽车&#xff0c;都会随之搭配一块独立的自动启停蓄电池&#xff0c;这块电池只单独为自动启停系统工作。那么同是蓄电池&#xff0c;自动启停电池和普通蓄电池有什么区别&#xff0c…

浮点数计算机的表示案例,计算机中的数据及其应用案例.docx

计算机中的数据及其运算HLJ_DJS☆笔记整理计算机中的数据包括数值性数据和非数值性数据两种。数据在计算机中通常是以二进制的形式表示的。对数值性数据进行编码即数值码&#xff0c;可以在计算机中对其进行各种数的运算。对非数值性数据进行编码&#xff0c;便于计算机进行识别…

返回内容验签失败_邮件经常失败回弹很糟心?一定要知道这几个小知识

很多人都反应每次发送邮件&#xff0c;总有一部分发生失败回弹&#xff0c;大大影响了送达率&#xff0c;非常糟心&#xff01;今天我们为大家整理了一些常见关于发送回弹状态的相关知识以及如何避免邮件回弹的注意事项。一、回弹状态的两种类型邮件发送失败时ESP(邮件供应服务…

Tomcat JDBC池–连接泄漏–捕获罪魁祸首

数据库连接泄漏是可以隐藏的东西&#xff0c;除非特别注意&#xff0c;否则将在系统高峰期最关键的阶段暴露出来。 我们将手动检查所有打开的连接是否已正确关闭。 然后&#xff0c;我们将提供各种代码质量插件来进行扫描和检查。 当连接通过复杂的程序结构传递时&#xff0c;这…

客户端怎么远程上服务器失败,远程客户端连接不上,与服务器那台,跨网络,怎么解决...

对应版本:用友U8.52对应产品线&#xff1a;供应链对应模块&#xff1a;销售管理模块问题现象:1、销售发货单参照单生成不能增行(充许超计单发货)&#xff1f;新增行单价为0如何体现。2、到货单中合格数不可填写(不用GSP质量管理)&#xff0c;参照生成的入库单不可改数量&#x…

用火狐录制脚本为空_功能测试——链接测试amp;脚本功能

链接测试对于页面链接功能&#xff0c;测试工程师需考虑其链接文字描述正确性、链接地址跳转正确性、链接触发脚本正确性、是否存在404错误等。如果是小型Web系统&#xff0c;链接较少&#xff0c;人工测试即可&#xff0c;如果被测对象包含很多链接&#xff0c;则可利用Xenu链…