国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

java實(shí)現(xiàn)視頻抽幀以及獲取其他視頻信息

這篇具有很好參考價(jià)值的文章主要介紹了java實(shí)現(xiàn)視頻抽幀以及獲取其他視頻信息。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

java實(shí)現(xiàn)視頻抽幀以及獲取其他視頻信息

1.在pom.xml文件中導(dǎo)入jar包

<dependency>
    <groupId>org.bytedeco</groupId>
    <artifactId>javacv</artifactId>
    <version>1.4.3</version>
</dependency>

<dependency>
    <groupId>org.bytedeco.javacpp-presets</groupId>
    <artifactId>ffmpeg-platform</artifactId>
    <version>4.0.2-1.4.3</version>
</dependency>

2.創(chuàng)建工具類FetchVideoFrameUtil,復(fù)制以下代碼

import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.assertj.core.util.Lists;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.FrameGrabber;
import org.bytedeco.javacv.Java2DFrameConverter;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.awt.*;
import java.io.File;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;


/**
 * Created with IDEA
 * 視頻取幀,可設(shè)置間隔秒數(shù)或獲取所有幀數(shù)
 *
 * @Author shunzi
 * @Date 2023/08/16 14:38:12
 * @Description
 * @Version 1.0
 */
@Slf4j
public class FetchVideoFrameUtil {

    // 主函數(shù)
    public static void main(String[] args){
        try {
            //批量處理,視頻所在文件夾
            String videoPath = "C:\\Users\\17386\\Desktop\\video\\normal video.mp4";
            //輸出圖片文件夾
            String picPath = "C:\\Users\\17386\\Desktop\\video-image3\\";
            // 獲取視頻FPS
            Double videoFrameRate = FetchVideoFrameUtil.getVideoFrameRate(new File(videoPath));
            log.info("視頻頻率:{}", videoFrameRate);
            // 根據(jù)FPS,動(dòng)態(tài)計(jì)算抽幀速率。示例為:每秒取一幀
            BigDecimal frameNumber = BigDecimal.valueOf(videoFrameRate);
            BigDecimal frameDecimal = frameNumber.setScale(0, RoundingMode.HALF_UP);
            // TODO 這里來更改抽幀速率,通過乘法運(yùn)算來控制。比如:控制抽幀頻率為2秒一幀,int second = 2 * frameDecimal.intValue()。以此類推
            int second = frameDecimal.intValue();
            log.info("抽幀頻率:{}", second);
            // 視頻時(shí)長
            log.info("視頻總時(shí)長:{}", FetchVideoFrameUtil.getVideoTime(new File(videoPath)));
            // 視頻總幀數(shù)
            log.info("視頻總共幀數(shù):{}", FetchVideoFrameUtil.getVideoFrameTotalLength(new File(videoPath)));
            // 開始視頻取幀流程
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            System.out.println("開始視頻取幀流程=====開始時(shí)間" + sdf.format(new Date()));
            List<File> files = FetchVideoFrameUtil.fetchPic(new File(videoPath), picPath, second);
            System.out.println("結(jié)束視頻取幀流程=====結(jié)束時(shí)間" + sdf.format(new Date()));
            log.info("抽取的圖片集合:{}", JSONObject.toJSONString(files));

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 獲取指定視頻的幀并保存為圖片至指定目錄
     * @param file  源視頻文件
     * @param picPath  截取幀的圖片存放路徑
     * @throws Exception
     */
    public static java.util.List<File> fetchPic(File file, String picPath, int second) throws Exception{
        java.util.List<File> list = Lists.newArrayList();
        FFmpegFrameGrabber ff = new FFmpegFrameGrabber(file); // 獲取視頻文件

        int length = FetchVideoFrameUtil.getVideoFrameTotalLength(file);
        ff.start(); // 調(diào)用視頻文件播放
        int i = 0; // 圖片幀數(shù),如需跳過前幾秒,則在下方過濾即可
        org.bytedeco.javacv.Frame frame = null;
        int count = 0;
        while (i < length) {
            frame = ff.grabImage(); // 獲取該幀圖片流
            System.out.print(i + ",");
            if(frame!=null && frame.image!=null) {
                System.out.println(i);
                writeToFile(frame, picPath, count,second,list); // 生成幀圖片
                count++;
            }
            i++;
        }
        ff.stop();
        return list;
    }

    /**
     *
     * @param frame // 視頻文件對(duì)象
     * @param picPath // 圖片存放路徑
     * @param count // 當(dāng)前取到第幾幀
     * @param second // 每隔多少幀取一張,一般高清視頻每秒 20-24 幀,根據(jù)情況配置,如果全部提取,則將second設(shè)為 0 即可
     * @param list // 返回文件結(jié)果
     */
    public static void writeToFile(org.bytedeco.javacv.Frame frame, String picPath, int count, int second, java.util.List<File> list){
        if (second == 0) {
            // 跳過間隔取幀判斷
        } else if (count % second != 0){ // 提取倍數(shù),如每秒取一張,則: second = 20
            return;
        }
        File targetFile = new File(picPath + count + ".jpg");
        System.out.println("創(chuàng)建了文件:" + picPath + count + ".jpg");
        list.add(targetFile);
        String imgSuffix = "jpg";

        Java2DFrameConverter converter =new Java2DFrameConverter();
        BufferedImage srcBi =converter.getBufferedImage(frame);
        int owidth = srcBi.getWidth();
        int oheight = srcBi.getHeight();
        // 對(duì)截取的幀進(jìn)行等比例縮放
        int width = 800;
        int height = (int) (((double) width / owidth) * oheight);
        BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
        bi.getGraphics().drawImage(srcBi.getScaledInstance(width, height, Image.SCALE_SMOOTH),0, 0, null);
        try {
            ImageIO.write(bi, imgSuffix, targetFile);
        }catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 獲取視頻時(shí)長,單位為秒
     * @param file
     * @return 時(shí)長(s)
     */
    public static Long getVideoTime(File file){
        Long times = 0L;
        try {
            FFmpegFrameGrabber ff = new FFmpegFrameGrabber(file);
            ff.start();
            times = ff.getLengthInTime()/(1000*1000);
            ff.stop();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return times;
    }

    /**
     * 獲取視頻幀率,單位FPS
     * @return
     */
    public static Double getVideoFrameRate(File file) {
        double frameRate = 0.0;
        try {
            FFmpegFrameGrabber ff = new FFmpegFrameGrabber(file);
            ff.start();
            frameRate = ff.getVideoFrameRate();
            ff.stop();
        } catch (FrameGrabber.Exception e) {
            throw new RuntimeException(e);
        }
        return frameRate;
    }

    /**
     * 獲取視頻真實(shí)格式
     * @param file
     * @return
     */
    public static String getVideoRealFormat(File file){
        String videoFormat = "";
        try {
            FFmpegFrameGrabber ff = new FFmpegFrameGrabber(file);
            ff.start();
            videoFormat = ff.getFormat();
            ff.stop();
        } catch (FrameGrabber.Exception e) {
            throw new RuntimeException(e);
        }
        return videoFormat;
    }

    /**
     * 獲取視頻總幀數(shù)長度
     * @return
     */
    public static int getVideoFrameTotalLength(File file) {
        int frameCount = 0;
        try {
            FFmpegFrameGrabber ff = new FFmpegFrameGrabber(file);
            ff.start();
            org.bytedeco.javacv.Frame frame;
            while ((frame = ff.grabImage()) != null) {
                frameCount++;
            }
            ff.stop();
        } catch (FrameGrabber.Exception e) {
            throw new RuntimeException(e);
        }
        return frameCount;
    }
}

文章引用出處:https://cloud.tencent.com/developer/article/1655887,并在原有基礎(chǔ)上做了優(yōu)化文章來源地址http://www.zghlxwxcb.cn/news/detail-652970.html

到了這里,關(guān)于java實(shí)現(xiàn)視頻抽幀以及獲取其他視頻信息的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • (Java版)根據(jù)ip獲取地理位置以及相關(guān)信息

    (Java版)根據(jù)ip獲取地理位置以及相關(guān)信息

    1.首先我們需要進(jìn)入地圖開放平臺(tái)的官網(wǎng),根據(jù)提示注冊(cè)賬號(hào),以百度地圖為例: https://lbsyun.baidu.com/ 我們新用戶登錄之后會(huì)彈出這個(gè)頁面,選擇個(gè)人愛好者進(jìn)入完成注冊(cè) 成功之后我們會(huì)進(jìn)入到下面這個(gè)頁面,如果沒有申請(qǐng)ak的小伙伴在控制臺(tái)看板這一塊是有一個(gè)流程指引的

    2024年02月08日
    瀏覽(22)
  • Python獲取音視頻時(shí)長

    上代碼:獲取音視頻時(shí)長.py pyinstaller -F 獲取音視頻時(shí)長.py 鏈接:https://pan.baidu.com/s/1WvsMyPHD3iFsM844gfC2Jg?pwd=yyds

    2024年02月15日
    瀏覽(27)
  • Java通過javacv獲取視頻、音頻、圖片等元數(shù)據(jù)信息(分辨率、大小、幀等信息)

    相信我們都會(huì)或多或少需要給前端返回視頻或者音頻的一些信息,那么今天這篇文章通過Java語言使用javacv來獲取視頻、音頻、圖片等元數(shù)據(jù)信息(分辨率、大小、幀等信息) 一、首先導(dǎo)入依賴 可以先導(dǎo)入javacv/javacv-platform依賴,由于依賴比較大,所以我們可以先去除部分不需

    2024年02月04日
    瀏覽(24)
  • FFmpeg基礎(chǔ):獲取音視頻的各種編碼參數(shù)

    FFmpeg基礎(chǔ):獲取音視頻的各種編碼參數(shù)

    獲取視頻編碼參數(shù) 視頻編碼參數(shù)主要包括:幀率、分辨率、編碼格式、碼率等,對(duì)應(yīng)的概念如下。 幀率(Frame Rate) 每秒顯示幀數(shù)(Frames Per Second)。電影的幀率一般是25fps和29.97fps,3D游戲要保持流暢則需要30fps以上的效果。 分辨率 指視頻寬高的像素?cái)?shù)值。標(biāo)準(zhǔn)1080P的分辨率為1920×

    2024年02月03日
    瀏覽(18)
  • MediaBox助力企業(yè)一站式獲取音視頻能力

    MediaBox助力企業(yè)一站式獲取音視頻能力

    以一只音視頻百寶箱,應(yīng)對(duì)「千行千面」。 洪炳峰、楚佩斯| 作者 大家好,今天我分享的主題是MediaBox——行業(yè)音視頻數(shù)字化再加速。 根據(jù)權(quán)威數(shù)據(jù)表明,65%的行業(yè)數(shù)字化信息來自視頻,基于此,音視頻技術(shù)對(duì)于行業(yè)數(shù)字化來說是至關(guān)重要的。今天我想借此機(jī)會(huì)向大家介紹

    2024年02月09日
    瀏覽(32)
  • elementUI實(shí)現(xiàn)上傳視頻時(shí)獲取視頻時(shí)長以及設(shè)置視頻格式、大小限制

    elementUI實(shí)現(xiàn)上傳視頻時(shí)獲取視頻時(shí)長以及設(shè)置視頻格式、大小限制

    在 before-upload 屬性綁定的事件中可以獲取上傳視頻的信息對(duì)象,通過給這個(gè)信息對(duì)象內(nèi)的屬性添加判斷條件就可以實(shí)現(xiàn)對(duì)視頻的格式及大小進(jìn)行限制。對(duì)于視頻時(shí)長,也包含在信息對(duì)象中,根據(jù)下面代碼所示方法提取即可。 想了解如何給上傳圖片添加限制的小伙伴,可以查看

    2024年02月14日
    瀏覽(22)
  • Qt/C++音視頻開發(fā)60-坐標(biāo)拾取/按下鼠標(biāo)獲取矩形區(qū)域/轉(zhuǎn)換到視頻源真實(shí)坐標(biāo)

    通過在通道畫面上拾取鼠標(biāo)按下的坐標(biāo),然后鼠標(biāo)移動(dòng),直到松開,根據(jù)松開的坐標(biāo)和按下的坐標(biāo),繪制一個(gè)矩形區(qū)域,作為熱點(diǎn)或者需要電子放大的區(qū)域,拿到這個(gè)坐標(biāo)區(qū)域,用途非常多,可以直接將區(qū)域中的畫面放大,也可以將該圈起來的區(qū)域位置發(fā)給設(shè)備,由設(shè)備設(shè)定

    2024年02月03日
    瀏覽(26)
  • python實(shí)現(xiàn)視頻抽幀,文件批量操作,文件批量處理(數(shù)據(jù)集制作的工具箱)

    環(huán)境準(zhǔn)備 數(shù)據(jù)集制作 文件批量重命名 文件批量移動(dòng) 將文件批量按照一定格式進(jìn)行重命名 修改xml文件內(nèi)容的方法 Pathlib庫的常用接口 在計(jì)算機(jī)視覺項(xiàng)目中,文件批量操作和文件批量預(yù)處理是必不可少的步驟。它們涉及處理大量的圖像文件,包括讀取、處理、保存和預(yù)處理。

    2024年02月09日
    瀏覽(19)
  • 「Python|場(chǎng)景案例」如何獲取音視頻中聲音片段的起止時(shí)間?

    「Python|場(chǎng)景案例」如何獲取音視頻中聲音片段的起止時(shí)間?

    本文主要介紹如何使用python的第三方庫moviepy找出音視頻中聲音開始出現(xiàn)的位置以及聲音結(jié)束的位置。 假設(shè)我們有一段音頻,音頻開始有一段無聲片段,音頻結(jié)束也有一段無聲片段,我們需要知道開頭無聲片段的結(jié)束位置和結(jié)束無聲片段的開始位置,或者換句話說, 我們需要

    2023年04月14日
    瀏覽(71)
  • 用ffmpeg解析mp4文件得到時(shí)長、比特率、音視頻信息

    以下是使用C++語言調(diào)用FFmpeg獲取視頻流和音頻流信息的示例代碼: 上述代碼通過 AVFormatContext 結(jié)構(gòu)體和FFmpeg庫函數(shù) avformat_open_input 、 avformat_find_stream_info 等,獲取MP4文件的視頻流和音頻流信息,并將結(jié)果存儲(chǔ)到 MediaInfo 類中。在實(shí)際應(yīng)用中,可以將上述代碼封裝成一個(gè)函數(shù),

    2024年02月12日
    瀏覽(97)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包