Java使用javacv处理视频文件过程记录

这篇具有很好参考价值的文章主要介绍了Java使用javacv处理视频文件过程记录。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最近接到一个需求是将.mp4/.m4v文件体积进行压缩,我使用javacv中的FFmpegFrameGrabber、FFmpegFrameFilter、FFmpegFrameRecorder简单的实现视频帧的抓取、过滤、录制与输出。
性能暂未验证。文章对这次的过程进行记录。


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.实现过程文章来源地址https://www.toymoban.com/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 = "目标文件地址";

        // 创建一个视频帧抓取器
        FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(inputFilePath);
        // 创建一个视频帧过滤器,用于修改视频分辨率
        FFmpegFrameFilter frameFilter = new FFmpegFrameFilter("scale=720:480", grabber.getImageWidth(), grabber.getImageHeight());
        // 创建一个视频帧录制器,用于将处理后的视频帧写入输出文件
        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());
            // 启动视频帧过滤器
            frameFilter.start();
            // 设置输出视频的格式,与输入视频相同
            recorder.setFormat(grabber.getFormat());
            // 设置视频的采样率和帧速率与输入视频相同
            recorder.setSampleRate(grabber.getSampleRate());
            recorder.setFrameRate(grabber.getFrameRate());
            // 设置视频比特率,值越大视频质量越好,文件体积也越大,可根据需要调整
            log.info("原视频比特率:{}", grabber.getVideoBitrate());
            //CRF 的值范围是0到51,其中 0 表示无损压缩,而 51 表示质量非常差的压缩
            recorder.setOption("crf","28");
            // 设置视频比特率
            recorder.setVideoBitrate(grabber.getVideoBitrate()/2);
            // 设置视频编解码器为h.264
            recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264); // 设置视频编解码器为h.264
            // 设置像素格式为YUV420P
            recorder.setPixelFormat(avutil.AV_PIX_FMT_YUV420P);
            // 设置音频参数
            recorder.setAudioChannels(2); // 设置音频通道数
            recorder.setAudioCodec(avcodec.AV_CODEC_ID_AAC); // 设置音频编解码器
            recorder.setSampleRate(grabber.getSampleRate()); // 设置音频采样率
            recorder.setAudioBitrate(grabber.getAudioBitrate()); // 音频比特率
            // 启动视频帧录制器
            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("压缩耗时:{}秒",  (System.currentTimeMillis()-now)/1000);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

到了这里,关于Java使用javacv处理视频文件过程记录的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包