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

Java使用javacv處理視頻文件過程記錄

這篇具有很好參考價(jià)值的文章主要介紹了Java使用javacv處理視頻文件過程記錄。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

最近接到一個(gè)需求是將.mp4/.m4v文件體積進(jìn)行壓縮,我使用javacv中的FFmpegFrameGrabber、FFmpegFrameFilter、FFmpegFrameRecorder簡單的實(shí)現(xiàn)視頻幀的抓取、過濾、錄制與輸出。
性能暫未驗(yàn)證。文章對(duì)這次的過程進(jìn)行記錄。


1.jdk的選擇
mcr.microsoft.com/java/jdk:8u222-zulu-centos


2.maven依賴

`<dependency>
            <groupId>org.bytedeco</groupId>
            <artifactId>javacv</artifactId>
            <version>1.4.4</version>
</dependency>
<dependency>
            <groupId>org.bytedeco</groupId>
            <artifactId>javacv-platform</artifactId>
            <version>1.4.4</version>
</dependency>`

3.實(shí)現(xiàn)過程文章來源地址http://www.zghlxwxcb.cn/news/detail-852503.html

import lombok.extern.slf4j.Slf4j;
import org.bytedeco.javacpp.avcodec;
import org.bytedeco.javacpp.avutil;
import org.bytedeco.javacv.FFmpegFrameFilter;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.FFmpegFrameRecorder;
import org.bytedeco.javacv.Frame;
import org.junit.Test;

@Slf4j
public class CoverVideoImageResolution {

    @Test
    public void changeResolution() {
        String inputFilePath = "原文件地址";
        String outputFilePath = "目標(biāo)文件地址";

        // 創(chuàng)建一個(gè)視頻幀抓取器
        FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(inputFilePath);
        // 創(chuàng)建一個(gè)視頻幀過濾器,用于修改視頻分辨率
        FFmpegFrameFilter frameFilter = new FFmpegFrameFilter("scale=720:480", grabber.getImageWidth(), grabber.getImageHeight());
        // 創(chuàng)建一個(gè)視頻幀錄制器,用于將處理后的視頻幀寫入輸出文件
        FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(outputFilePath, 720, 480);

        try {
            long now = System.currentTimeMillis();
            // 開始從輸入文件中抓取視頻幀
            grabber.start();
            log.info("Video Frame Rate:{};",grabber.getFrameRate());
            log.info("Video Width:{};",grabber.getImageWidth());
            log.info("Video Height:{};",grabber.getImageHeight());
            log.info("Video Bitrate:{};",grabber.getVideoBitrate());
            log.info("Video Sample Rate:{};",grabber.getSampleRate());
            log.info("Video Codec:{};",grabber.getVideoCodec());
            // 啟動(dòng)視頻幀過濾器
            frameFilter.start();
            // 設(shè)置輸出視頻的格式,與輸入視頻相同
            recorder.setFormat(grabber.getFormat());
            // 設(shè)置視頻的采樣率和幀速率與輸入視頻相同
            recorder.setSampleRate(grabber.getSampleRate());
            recorder.setFrameRate(grabber.getFrameRate());
            // 設(shè)置視頻比特率,值越大視頻質(zhì)量越好,文件體積也越大,可根據(jù)需要調(diào)整
            log.info("原視頻比特率:{}", grabber.getVideoBitrate());
            //CRF 的值范圍是0到51,其中 0 表示無損壓縮,而 51 表示質(zhì)量非常差的壓縮
            recorder.setOption("crf","28");
            // 設(shè)置視頻比特率
            recorder.setVideoBitrate(grabber.getVideoBitrate()/2);
            // 設(shè)置視頻編解碼器為h.264
            recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264); // 設(shè)置視頻編解碼器為h.264
            // 設(shè)置像素格式為YUV420P
            recorder.setPixelFormat(avutil.AV_PIX_FMT_YUV420P);
            // 設(shè)置音頻參數(shù)
            recorder.setAudioChannels(2); // 設(shè)置音頻通道數(shù)
            recorder.setAudioCodec(avcodec.AV_CODEC_ID_AAC); // 設(shè)置音頻編解碼器
            recorder.setSampleRate(grabber.getSampleRate()); // 設(shè)置音頻采樣率
            recorder.setAudioBitrate(grabber.getAudioBitrate()); // 音頻比特率
            // 啟動(dòng)視頻幀錄制器
            recorder.start();

            Frame frame;
            // 處理視頻幀并將處理后的幀寫入輸出文件
            while ((frame = grabber.grab()) != null) {
                frameFilter.push(frame);// 將抓取的視頻幀傳遞給過濾器
                Frame filteredFrame = frameFilter.pull();// 獲取過濾后的視頻幀
                recorder.record(filteredFrame);// 將過濾后的視頻幀寫入輸出文件
            }
            // 停止視頻幀抓取器、過濾器和錄制器
            grabber.stop();
            frameFilter.stop();
            recorder.stop();
            System.out.println("Video resolution modified successfully.");
            log.info("壓縮耗時(shí):{}秒",  (System.currentTimeMillis()-now)/1000);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

到了這里,關(guān)于Java使用javacv處理視頻文件過程記錄的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(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)文章

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包