更新时间:2019年07月26日 10时55分21秒 来源:黑马程序员论坛
:APP上需要在获取视频列表时就获取视频的时长,但早期上传的时候数据库都没有保存这个数据,所以前段时间添加一个时长字段,在上传时手动输入视频时长,但是之前库中有上万条数据没这个信息,如果这样一条一条手动输入,人都得疯掉。所以谁也不提不管这破事,在这之前的视频时长信息就让它空在那。最近领导让我做个按类目分类统计视频时长信息,和领导反映了这个问题,最终解决方案就把没有的做0处理。在完成了这个功能后,我就在想能用什么方式把之前的视频时长全部给更新上去。手动输入这个肯定时不行的,必须得java后台来获取录入。但上网搜索了无数的帖子,最终通过java实现的只有一种方法能用,那就是先要下载到本地,然后再一个一个的遍历查询。看着服务器上的上万个视频,想想这方法就让人头皮发麻。 虽然没找到可行方法,但基本上都是用jave获取视频信息的。于是就去查看jave的官方API,了解到是通过FFmpeg处理多媒体文件,接着又查看FFmpeg的API,发现ffmpeg在命令行中使用时可以通过url获取视频。但使用jave工具包时获取MultimediaInfo就必须得传入File,可是又不能通过url创建File。于是就就反编译jave的jar从源码上动手。 [url=][/url]// 源码 public MultimediaInfo getInfo(File source) throws InputFormatException, EncoderException { FFMPEGExecutor ffmpeg; ffmpeg = locator.createExecutor(); ffmpeg.addArgument("-i"); ffmpeg.addArgument(source.getAbsolutePath()); try { ffmpeg.execute(); } catch(IOException e) { throw new EncoderException(e); } MultimediaInfo multimediainfo; RBufferedReader reader = null; reader = new RBufferedReader(new InputStreamReader(ffmpeg.getErrorStream())); multimediainfo = parseMultimediaInfo(source, reader); ffmpeg.destroy(); return multimediainfo; Exception exception; exception; ffmpeg.destroy(); throw exception; }[url=][/url] ffmpeg传入参数时使用的是 source.getAbsolutePath()获取文件的绝对路径,所以通过url创建File在这是获取的就是 项目路径+url了。然后就把传入path修改成了url,但是运行还是出现 InputFormatException异常。好吧,那就继续找问题吧 然后debug发现虽然修改了path,但是这路径细看还是不对 http://v1.v.123.com\11\919\2019\zb\0181.mp4正确的url应该是这样的:http://v1.v.123.com/11/919/2019/zb/0181.mp4 接着更正问题。 if(path.indexOf("http") != -1) { path = source.getPath(); path = path.split(":")[0] + "://" + path.split(":")[1].substring(1); path = path.replace("\\", "/"); }这次终于没问题了,可以正常使用了。然后还有下面这个方法的调用,源码中有个获取异常信息的也得修改path值 multimediainfo = parseMultimediaInfo(source, reader); 这个也和只需重复上面的操作就OK了。这样就完全搞定了。 [url=][/url]import lx.jave.AudioAttributes;import lx.jave.AudioInfo;import lx.jave.Encoder;import lx.jave.EncoderException;import lx.jave.EncodingAttributes;import lx.jave.InputFormatException;import lx.jave.MultimediaInfo;import lx.jave.VideoInfo;import lx.jave.VideoSize;/** * jave多媒体工具类(需导出jave jar包) * @author longxiong * */public class JaveToolsTest { public static void main(String[] args) throws InputFormatException, EncoderException, Exception { /** * 获取本地多媒体文件信息 */ // 编码器 Encoder encoder = new Encoder(); File file = new File("http://*****018.mp4"); // 多媒体信息 MultimediaInfo info = encoder.getInfo(file); // 时长信息 long duration = info.getDuration(); System.out.println("视频时长为:" + duration / 1000 + "秒"); // 音频信息 AudioInfo audio = info.getAudio(); int bitRate = audio.getBitRate(); // 比特率 int channels = audio.getChannels(); // 声道 String decoder = audio.getDecoder(); // 解码器 int sRate = audio.getSamplingRate(); // 采样率 System.out.println("解码器:" + decoder + ",声道:" + channels + ",比特率:" + bitRate + ",采样率:" + sRate); // 视频信息 VideoInfo video = info.getVideo(); int bitRate2 = video.getBitRate(); Float fRate = video.getFrameRate(); // 帧率 VideoSize videoSize = video.getSize(); int height = videoSize.getHeight(); // 视频高度 int width = videoSize.getWidth(); // 视频宽度 System.out.println("视频帧率:" + fRate + ",比特率:" + bitRate2 + ",视频高度:" + height + ",视频宽度:" + width); }}[url=][/url] |
推荐了解热门学科
java培训 | Python人工智能 | Web前端培训 | PHP培训 |
区块链培训 | 影视制作培训 | C++培训 | 产品经理培训 |
UI设计培训 | 新媒体培训 | 产品经理培训 | Linux运维 |
大数据培训 | 智能机器人软件开发 |
传智播客是一家致力于培养高素质软件开发人才的科技公司,“黑马程序员”是传智播客旗下高端IT教育品牌。自“黑马程序员”成立以来,教学研发团队一直致力于打造精品课程资源,不断在产、学、研3个层面创新自己的执教理念与教学方针,并集中“黑马程序员”的优势力量,针对性地出版了计算机系列教材50多册,制作教学视频数+套,发表各类技术文章数百篇。
传智播客从未停止思考
传智播客副总裁毕向东在2019IT培训行业变革大会提到,“传智播客意识到企业的用人需求已经从初级程序员升级到中高级程序员,具备多领域、多行业项目经验的人才成为企业用人的首选。”
中级程序员和初级程序员的差别在哪里?
项目经验。毕向东表示,“中级程序员和初级程序员最大的差别在于中级程序员比初级程序员多了三四年的工作经验,从而多出了更多的项目经验。“为此,传智播客研究院引进曾在知名IT企业如阿里、IBM就职的高级技术专家,集中研发面向中高级程序员的课程,用以满足企业用人需求,尽快补全IT行业所需的人才缺口。
何为中高级程序员课程?
传智播客进行了定义。中高级程序员课程,是在当前主流的初级程序员课程的基础上,增加多领域多行业的含金量项目,从技术的广度和深度上进行拓展。“我们希望用5年的时间,打造上百个高含金量的项目,覆盖主流的32个行业。”传智播客课程研发总监于洋表示。
黑马程序员热门视频教程【点击播放】
Python入门教程完整版(懂中文就能学会) | 零起点打开Java世界的大门 |
C++| 匠心之作 从0到1入门学编程 | PHP|零基础入门开发者编程核心技术 |
Web前端入门教程_Web前端html+css+JavaScript | 软件测试入门到精通 |