javaCV音频剪切

java 复制代码
			// 设置 FFmpeg 日志回调,以便打印详细的 FFmpeg 日志
            FFmpegLogCallback.set();
            FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(inputFile);
            grabber.start();
            
            int audioChannels = grabber.getAudioChannels();
            int audioSampleRate = grabber.getSampleRate();
            int audioBitrate = grabber.getAudioBitrate();
            //视频质量,0最高,50最低
            double audioQuality = 0;
            //直接获取的音频format不能使用,这里指定
            String audioFormat = "mp3";
            FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(outputFile, audioChannels);
            //这里有一个对应关系,代码九不列出了,具体编码在 org.bytedeco.ffmpeg.global.avcodec 类中,如 avcodec.AV_CODEC_ID_MP3
            int audioCodec = Util.audioCodecMatch(audioFormat);

            // 设置音频
            recorder.setSampleRate(audioSampleRate);
            recorder.setAudioBitrate(audioBitrate);
            if (audioCodec != -1) {
                recorder.setAudioCodec(audioCodec);
            }
            recorder.setFormat(audioFormat);
            recorder.setAudioQuality(audioQuality);
            recorder.start();
            Frame frame;

			//这里指定裁剪的时间区间
            long start = TimeUnit.MICROSECONDS.convert(startMs, TimeUnit.MILLISECONDS);
            long end = TimeUnit.MICROSECONDS.convert(endMs, TimeUnit.MILLISECONDS);
            while ((frame = grabber.grabSamples()) != null) {
                //grabber.getTimestamp() 返回的是微秒(us)
                long frameNumber = grabber.getTimestamp();
                if (frameNumber >= start * 1000 && frameNumber <= end * 1000) {
                    recorder.record(frame);
                }
                if (frameNumber > end) {
                    break;
                }
            }

            recorder.stop();
            grabber.stop();

这段代码不影响使用,但是根据打印的日志,总会有几帧没有处理,可能和设置的buffer有关,了解怎么解决的麻烦在评论区写一下,大家一起进步。

相关推荐
vx_BS813301 天前
【直接可用源码免费送】计算机毕业设计精选项目03574基于Python的网上商城管理系统设计与实现:Java/PHP/Python/C#小程序、单片机、成品+文档源码支持定制
java·python·课程设计
2601_949868361 天前
Flutter for OpenHarmony 电子合同签署App实战 - 已签合同实现
java·开发语言·flutter
达文汐1 天前
【困难】力扣算法题解析LeetCode332:重新安排行程
java·数据结构·经验分享·算法·leetcode·力扣
培风图南以星河揽胜1 天前
Java版LeetCode热题100之零钱兑换:动态规划经典问题深度解析
java·leetcode·动态规划
启山智软1 天前
【中大企业选择源码部署商城系统】
java·spring·商城开发
我真的是大笨蛋1 天前
深度解析InnoDB如何保障Buffer与磁盘数据一致性
java·数据库·sql·mysql·性能优化
怪兽源码1 天前
基于SpringBoot的选课调查系统
java·spring boot·后端·选课调查系统
恒悦sunsite1 天前
Redis之配置只读账号
java·redis·bootstrap
梦里小白龙1 天前
java 通过Minio上传文件
java·开发语言
人道领域1 天前
javaWeb从入门到进阶(SpringBoot事务管理及AOP)
java·数据库·mysql