黑马程序员技术交流社区

标题: 【上海校区】JAVA通过URL链接获取视频文件信息(无需下载... [打印本页]

作者: 梦缠绕的时候    时间: 2019-7-22 13:34
标题: 【上海校区】JAVA通过URL链接获取视频文件信息(无需下载...
: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]




作者: 梦缠绕的时候    时间: 2019-7-22 13:34
有任何问题欢迎在评论区留言
作者: 梦缠绕的时候    时间: 2019-7-22 13:34
或者添加学姐微信
DKA-2018




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2