java通过url获取视频时长(无需下载文件)

文章展示了如何在Java项目中引入FFmpeg库(通过jave-core依赖)并创建FFmpegFileInfo类来获取多媒体文件的详细信息,如格式、时长、帧率等。通过FFMPEGLocator和FFMPEGExecutor执行命令并解析输出以提取元数据。
摘要由CSDN通过智能技术生成

 1、导入架包

        <!-- jave 核心依赖 -->
        <dependency>
            <groupId>ws.schild</groupId>
            <artifactId>jave-core</artifactId>
            <version>2.4.6</version>
        </dependency>
 
        <!-- 根据不同操作系统引入不同FFmpeg包 -->
        <!-- window32位 FFmpeg -->
        <dependency>
            <groupId>ws.schild</groupId>
            <artifactId>jave-native-win32</artifactId>
            <version>2.4.6</version>
        </dependency>
        <!-- window64位 FFmpeg -->
        <dependency>
            <groupId>ws.schild</groupId>
            <artifactId>jave-native-win64</artifactId>
            <version>2.4.6</version>
        </dependency>
        <!-- linux64位 FFmpeg -->
        <dependency>
            <groupId>ws.schild</groupId>
            <artifactId>jave-native-linux64</artifactId>
            <version>2.4.6</version>
        </dependency>
        <!-- macos64位 FFmpeg -->
        <dependency>
            <groupId>ws.schild</groupId>
            <artifactId>jave-native-osx64</artifactId>
            <version>2.4.6</version>
        </dependency>

2、创建FFmpegFileInfo类(类的位置ws.schild.jave)

package ws.schild.jave;

import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class FFmpegFileInfo {
    private static final Log LOG = LogFactory.getLog(MultimediaObject.class);
    private static final Pattern SIZE_PATTERN = Pattern.compile("(\\d+)x(\\d+)", 2);
    private static final Pattern FRAME_RATE_PATTERN = Pattern.compile("([\\d.]+)\\s+(?:fps|tbr)", 2);
    private static final Pattern BIT_RATE_PATTERN = Pattern.compile("(\\d+)\\s+kb/s", 2);
    private static final Pattern SAMPLING_RATE_PATTERN = Pattern.compile("(\\d+)\\s+Hz", 2);
    private static final Pattern CHANNELS_PATTERN = Pattern.compile("(mono|stereo|quad)", 2);
    private final FFMPEGLocator locator;
    private File inputFile;

    public FFmpegFileInfo(File input) {
        this.locator = new DefaultFFMPEGLocator();
        this.inputFile = input;
    }

    public File getFile() {
        return this.inputFile;
    }

    public void setFile(File file) {
        this.inputFile = file;
    }

    public FFmpegFileInfo(File input, FFMPEGLocator locator) {
        this.locator = locator;
        this.inputFile = input;
    }

    public MultimediaInfo getInfo(String url) throws InputFormatException, EncoderException {
        FFMPEGExecutor ffmpeg = this.locator.createExecutor();
        ffmpeg.addArgument("-i");
        ffmpeg.addArgument(url);

        try {
            ffmpeg.execute();
        } catch (IOException var9) {
            throw new EncoderException(var9);
        }

        MultimediaInfo var4;
        try {
            RBufferedReader reader = new RBufferedReader(new InputStreamReader(ffmpeg.getErrorStream()));
            var4 = this.parseMultimediaInfo(this.inputFile, reader);
        } finally {
            ffmpeg.destroy();
        }

        return var4;
    }

    private MultimediaInfo parseMultimediaInfo(File source, RBufferedReader reader) throws InputFormatException, EncoderException {
        Pattern p1 = Pattern.compile("^\\s*Input #0, (\\w+).+$\\s*", 2);
        Pattern p2 = Pattern.compile("^\\s*Duration: (\\d\\d):(\\d\\d):(\\d\\d)\\.(\\d\\d).*$", 2);
        Pattern p3 = Pattern.compile("^\\s*Stream #\\S+: ((?:Audio)|(?:Video)|(?:Data)): (.*)\\s*$", 2);
        Pattern p4 = Pattern.compile("^\\s*Metadata:", 2);
        MultimediaInfo info = null;

        try {
            int step = 0;

            while(true) {
                String line = reader.readLine();
                LOG.debug("Output line: " + line);
                if (line == null) {
                    break;
                }

                Matcher m;
                String type;
                switch(step) {
                case 0:
                    String token = source.getAbsolutePath() + ": ";
                    if (line.startsWith(token)) {
                        String message = line.substring(token.length());
                        throw new InputFormatException(message);
                    }

                    Matcher m = p1.matcher(line);
                    if (m.matches()) {
                        type = m.group(1);
                        info = new MultimediaInfo();
                        info.setFormat(type);
                        ++step;
                    }
                    break;
                case 1:
                    m = p2.matcher(line);
                    if (m.matches()) {
                        long hours = (long)Integer.parseInt(m.group(1));
                        long minutes = (long)Integer.parseInt(m.group(2));
                        long seconds = (long)Integer.parseInt(m.group(3));
                        long dec = (long)Integer.parseInt(m.group(4));
                        long duration = dec * 10L + seconds * 1000L + minutes * 60L * 1000L + hours * 60L * 60L * 1000L;
                        info.setDuration(duration);
                        ++step;
                    }
                    break;
                case 2:
                    m = p3.matcher(line);
                    p4.matcher(line);
                    if (m.matches()) {
                        type = m.group(1);
                        String specs = m.group(2);
                        StringTokenizer st;
                        int i;
                        String token;
                        boolean parsed;
                        Matcher m2;
                        int bitRate;
                        if ("Video".equalsIgnoreCase(type)) {
                            VideoInfo video = new VideoInfo();
                            st = new StringTokenizer(specs, ",");

                            for(i = 0; st.hasMoreTokens(); ++i) {
                                token = st.nextToken().trim();
                                if (i == 0) {
                                    video.setDecoder(token);
                                } else {
                                    parsed = false;
                                    m2 = SIZE_PATTERN.matcher(token);
                                    if (!parsed && m2.find()) {
                                        bitRate = Integer.parseInt(m2.group(1));
                                        int height = Integer.parseInt(m2.group(2));
                                        video.setSize(new VideoSize(bitRate, height));
                                        parsed = true;
                                    }

                                    m2 = FRAME_RATE_PATTERN.matcher(token);
                                    if (!parsed && m2.find()) {
                                        try {
                                            float frameRate = Float.parseFloat(m2.group(1));
                                            video.setFrameRate(frameRate);
                                        } catch (NumberFormatException var22) {
                                            LOG.info("Invalid frame rate value: " + m2.group(1), var22);
                                        }

                                        parsed = true;
                                    }

                                    m2 = BIT_RATE_PATTERN.matcher(token);
                                    if (!parsed && m2.find()) {
                                        bitRate = Integer.parseInt(m2.group(1));
                                        video.setBitRate(bitRate * 1000);
                                        parsed = true;
                                    }
                                }
                            }

                            info.setVideo(video);
                        } else if ("Audio".equalsIgnoreCase(type)) {
                            AudioInfo audio = new AudioInfo();
                            st = new StringTokenizer(specs, ",");

                            for(i = 0; st.hasMoreTokens(); ++i) {
                                token = st.nextToken().trim();
                                if (i == 0) {
                                    audio.setDecoder(token);
                                } else {
                                    parsed = false;
                                    m2 = SAMPLING_RATE_PATTERN.matcher(token);
                                    if (!parsed && m2.find()) {
                                        bitRate = Integer.parseInt(m2.group(1));
                                        audio.setSamplingRate(bitRate);
                                        parsed = true;
                                    }

                                    m2 = CHANNELS_PATTERN.matcher(token);
                                    if (!parsed && m2.find()) {
                                        String ms = m2.group(1);
                                        if ("mono".equalsIgnoreCase(ms)) {
                                            audio.setChannels(1);
                                        } else if ("stereo".equalsIgnoreCase(ms)) {
                                            audio.setChannels(2);
                                        } else if ("quad".equalsIgnoreCase(ms)) {
                                            audio.setChannels(4);
                                        }

                                        parsed = true;
                                    }

                                    m2 = BIT_RATE_PATTERN.matcher(token);
                                    if (!parsed && m2.find()) {
                                        bitRate = Integer.parseInt(m2.group(1));
                                        audio.setBitRate(bitRate * 1000);
                                        parsed = true;
                                    }
                                }
                            }

                            info.setAudio(audio);
                        }
                    }
                }

                if (line.startsWith("frame=")) {
                    reader.reinsertLine(line);
                    break;
                }
            }
        } catch (IOException var23) {
            throw new EncoderException(var23);
        }

        if (info == null) {
            throw new InputFormatException();
        } else {
            return info;
        }
    }
}

3、打包把类打成class文件放到本地的Maven仓库(如果在测试类中使用跳过此步)

 4、测试

String url="https://xxx.mp4";
        File mediaFile = new File(url);
        FFmpegFileInfo ffmpegFileInfo = new FFmpegFileInfo(mediaFile);
        MultimediaInfo info = null;
        try {
            info = ffmpegFileInfo.getInfo(url);
            long duration = info.getDuration();
            System.out.println("============="+duration/1000);
        } catch (EncoderException e) {
            e.printStackTrace();
        }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
125分50秒---162.81M---LabView01---第10章数据的显示.wmv---F:/Resource/video/硬件/AltiumDesigner/LabView01-第10章数据的显示.wmv 92分2秒---143.46M---LabView02---第11章文件的IO及保存.wmv---F:/Resource/video/硬件/AltiumDesigner/LabView02-第11章文件的IO及保存.wmv 37分22秒---58.09M---LabView03---第12章LabVIEW的通信.wmv---F:/Resource/video/硬件/AltiumDesigner/LabView03-第12章LabVIEW的通信.wmv 9分58秒---21.2M---LabView04---第13章LabVIEW与其它软件的连接.wmv---F:/Resource/video/硬件/AltiumDesigner/LabView04-第13章LabVIEW与其它软件的连接.wmv 4分45秒---9.99M---LabView05---第14章LabVIEW中子VI的设置及调用.wmv---F:/Resource/video/硬件/AltiumDesigner/LabView05-第14章LabVIEW中子VI的设置及调用.wmv 34分30秒---61.03M---LabView06---第15章其它高级技巧.wmv---F:/Resource/video/硬件/AltiumDesigner/LabView06-第15章其它高级技巧.wmv 9分41秒---11.37M---LabView07---第2章第一个LabVIEW例子.wmv---F:/Resource/video/硬件/AltiumDesigner/LabView07-第2章第一个LabVIEW例子.wmv 86分58秒---140.25M---LabView08---第3章基本元素.wmv---F:/Resource/video/硬件/AltiumDesigner/LabView08-第3章基本元素.wmv 76分48秒---143.72M---LabView09---第4章程序结构.wmv---F:/Resource/video/硬件/AltiumDesigner/LabView09-第4章程序结构.wmv 5分46秒---14.67M---LabView10---第5章数据采集.wmv---F:/Resource/video/硬件/AltiumDesigner/LabView10-第5章数据采集.wmv 12分50秒---18.35M---LabView11---第6章数据传输及电脑接口.wmv---F:/Resource/video/硬件/AltiumDesigner/LabView11-第6章数据传输及电脑接口.wmv 59分57秒---87.83M---LabView12---第7章数据的分析及处理.wmv---F:/Resource/video/硬件/AltiumDesigner/LabView12-第7章数据的分析及处理.wmv 42分4秒---61.02M---LabView13---第8章LabVIEW的信号调理.wmv---F:/Resource/video/硬件/AltiumDesigner/LabView13-第8章LabVIEW的信号调理.wmv 132分19秒---178.86M---LabView14---第9章分析处理中数学计算.wmv---F:/Resource/video/硬件/AltiumDesigner/LabView14-第9章分析处理中数学计算.wmv
### 回答1: 要使用Java获取微信视频视频,首先需要了解微信视频号开放平台的接口规范和认证流程。 1. 完成开发者注册和认证:在微信视频号开放平台注册一个开发者账号并完成认证,获得开发者的appId和appSecret。 2. 获取access_token:使用HttpClient或其他HTTP请求库发送GET请求,向微信开放平台接口获取access_token。请求的URL为:https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET。其中,APPID为开发者的appId,APPSECRET为开发者的appSecret。 3. 获取视频素材列表:使用HttpClient发送GET请求,向微信开放平台接口获取视频素材列表。请求的URL为:https://api.weixin.qq.com/wxaapi/broadcast/getvideolist?access_token=ACCESS_TOKEN。其中,ACCESS_TOKEN为获取到的access_token。 4. 解析返回结果:对获取到的视频素材列表进行解析,并提取所需的视频信息,如视频ID、标题、封面图等。 5. 选择目标视频:根据需求选择需要获取的具体视频。 6. 获取视频素材:使用HttpClient发送GET请求,向微信开放平台接口获取视频素材。请求的URL为:https://api.weixin.qq.com/wxaapi/broadcast/getvideo?access_token=ACCESS_TOKEN&media_id=MEDIA_ID。其中,ACCESS_TOKEN为获取到的access_token,MEDIA_ID为目标视频的ID。 7. 处理视频素材:对获取到的视频素材进行处理,如保存到本地或进行其他操作。 需要注意的是,此处只是简单的概括了获取微信视频视频的过程,具体实现过程可能会因微信开放平台的接口规范而有所不同。在开发过程中,还需要注意接口的调用频率限制、参数的正确传递等问题。同时,使用合适的库或框架可以简化开发流程,如使用Spring Boot来构建项目、使用OkHttp来发送HTTP请求、使用Jackson来进行JSON解析等。 ### 回答2: 要使用Java获取微信视频号的视频,需要借助微信公众平台提供的接口。 首先,使用Java编写代码,通过HTTP请求访问微信公众平台的API接口。可以使用Java的HttpClient库或者OkHttp库来发送GET、POST等请求。 接着,需要获取到微信的access token,用于身份验证。可以通过接口获取授权后的access token,或者使用第三方库来实现授权流程。 然后,使用获取到的access token构造请求URL,调用微信公众平台的视频接口。具体的接口地址可以参考微信开发文档。 在调用视频接口时,需要提供视频的唯一标识,可以是视频的ID或者其他识别码。同时,还可以设置一些参数,如视频的起始时间、结束时间等。 最后,解析接口返回的数据,可以使用JSON解析库来解析返回的JSON格式数据。根据返回的结果,可以获取视频的相关信息,如视频的标题、封面、时长等。 总结起来,获取微信视频视频需要先获取access token,然后构造请求URL,调用接口获取视频信息,最后解析返回的数据。通过Java的HTTP请求和JSON解析库,可以很方便地实现这个过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值