目录

  • 背景
  • 代码
  • 效果
  • 遇到的问题
  • 参考

背景

  • 要做一个预览视频的功能,把整个视频截取一段出来。没有直接使用FFmpeg,而是使用了javacpp的库。

代码

  • 依赖的jar包
 <properties><javacv>1.4.3</javacv><ffmpeg-platform>4.0.2-1.4.3</ffmpeg-platform><hutool.version>5.8.5</hutool.version></properties><dependencies><dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId></dependency><groupId>org.bytedeco</groupId><artifactId>javacv</artifactId></dependency><dependency><groupId>org.bytedeco.javacpp-presets</groupId><artifactId>ffmpeg-platform</artifactId></dependency></dependencies>
  • 代码实现
   import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.text.StrSplitter;
import org.bytedeco.javacpp.Loader;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.FFmpegFrameRecorder;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.Java2DFrameConverter;import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.text.MessageFormat;
import java.util.Arrays;
import java.util.List;
import java.util.Map;import org.bytedeco.javacpp.avcodec;/*** @author Zhou Zhongqing* @ClassName PreviewVideoUtils* @description: 预览视频* @date 2023-03-03 14:58*/
public class PreviewVideoUtils {/*** 生成预览视频** @param sourcePath* @param targetPath*/public static void generatePreviewVideo(String sourcePath, String targetPath) {try (FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(sourcePath);FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(targetPath, grabber.getImageWidth(), grabber.getImageHeight(), 2)) {grabber.start();// 重新设置 宽高recorder.setImageWidth(grabber.getImageWidth());recorder.setImageHeight(grabber.getImageHeight());// 解决生成的视频无法播放的问题recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);recorder.setFormat("mp4");recorder.setFrameRate(grabber.getFrameRate());recorder.setSampleRate(grabber.getSampleRate());recorder.setAudioChannels(grabber.getAudioChannels());recorder.setFrameRate(grabber.getFrameRate());grabber.setTimestamp(20 * 1000000);Map<String, Object> filter = MapUtil.filter(BeanUtil.beanToMap(grabber));BeanUtil.copyProperties(filter, recorder);recorder.start();Frame inFrame;int count = 0;while ((inFrame = grabber.grab()) != null) {// System.out.println(inFrame.timestamp);
//                if (inFrame.timestamp >= 50 * 1000 * 1000) {//                    break;
//                }if (count > 1000) {break;}count++;recorder.record(inFrame);}} catch (Exception exception) {exception.printStackTrace();}}public static void main(String[] args) {String inFile = "C:\\Users\\Windows3\\Videos\\test\\trailer.mp4";   //读取的视频String outFile = "C:\\Users\\Windows3\\Videos\\test\\2.mp4";  //将要生成的剪切视频generatePreviewVideo(inFile, outFile);
//        test();}
}

效果

  • 原视频大约50几秒,转成了只有10几秒的预览视频

遇到的问题

  • No video output stream (Is imageWidth > 0 && imageHeight > 0 and has start() been called?)

增加int imageWidth, int imageHeight,参数
FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(“C:\Users\Windows3\Videos\2.mp4”, 1280, 720, 2)

参考

  • https://segmentfault.com/a/1190000039782685?sort=newest
  • https://www.cnblogs.com/wuxun1997/p/12936311.html
  • https://my.oschina.net/110NotFound/blog/5336500
  • https://juejin.cn/post/6988733165258932261

javacv 切割视频相关推荐

  1. 单选按钮必填会有红色选中提示吗_视频切割怎么弄?视频剪辑软件可以切割视频吗?...

    很多人在提及视频剪辑的时候,首先会想到的就是各种炫酷的操作,例如添加动画特效啊,配上背景音乐啊,配上字幕啊一类的,殊不知,在所有的操作之前,咱们都得先完成一个步骤,那便是视频切割!很多时候,咱们的素材 ...

  2. JavaCV音视频开发宝典:基于JavaCV实现wav音频直播服务,wav在线FM电台直播服务,无需流媒体服务,浏览器原生audio标签直接播放wav直播音频

    <JavaCV音视频开发宝典>专栏目录导航 <JavaCV音视频开发宝典>专栏介绍和目录 ​ 前言 之前写过了mp3实现FM电台直播服务:<JavaCV音视频开发宝典:J ...

  3. JavaCV音视频开发宝典:JavaCV实现mp3音频直播FM在线电台服务,无需流媒体服务,浏览器原生audio标签直接播放mp3,支持rtsp/rtmp/flv/hls/本地音视频源直接转码到mp3

    <JavaCV音视频开发宝典>专栏目录导航 <JavaCV音视频开发宝典>专栏介绍和目录 ​ 前言 之前写过使用JavaCV实现webm直播的文章: <JavaCV音视频 ...

  4. 视频截帧:javacv实现视频截帧功能

    javacv实现视频截帧功能 引入依赖 使用 引入依赖 <dependency><groupId>org.bytedeco</groupId><artifac ...

  5. JavaCV音视频开发宝典:JavaCV使用gdigrab方式实现windows录屏(windows屏幕画面抓取/采集,可实现高帧率屏幕截屏、录屏功能)

    <JavaCV音视频开发宝典>专栏目录导航 <JavaCV音视频开发宝典>专栏介绍和目录 前言 本系列文章前面内容基本覆盖了推流拉流等内容,屏幕截屏之前也写过,只不过是基于ja ...

  6. JavaCV音视频开发宝典:vb8和vp9编码的webm格式视频文件转成mp4文件

    <JavaCV音视频开发宝典>专栏目录导航 <JavaCV音视频开发宝典>专栏介绍和目录 ​ 前言 mp4不用多说,我们日常生活中,手机上或者浏览器网页中使用最多的视频文件就是 ...

  7. Nvivo如何导入视频、切割视频、以及编码视频

    Nvivo如何导入视频.切割视频.以及编码视频## 标题 一.视频导入 在导入视频之前需要先安装视频解码工具,mp4格式的视频无法导入到nvivo中 视频解码工具k-lite(要梯子,如果没有可以下载 ...

  8. JAVACV实现视频帧添加中文水印

    @[TOC] JAVACV实现视频帧添加中文水印 JAVACV实现视频帧添加中文水印 最近有个项目需要用到监控视频和采集数据融合显示的问题.通过各种尝试,最终确定可以使用javacv+nginx-te ...

  9. JavaCV音视频开发宝典:UDP推流 使用UDP方式推送TS流 实现UDP一对一直播点播

    <JavaCV音视频开发宝典>专栏目录导航 <JavaCV音视频开发宝典>专栏介绍和目录 前言 之前写rtp推流(JavaCV音视频开发宝典:rtsp拉流并使用转码方式转推到r ...

最新文章

  1. Unigui 服务器解析php,如何正确使用uniGUI的HyperServer(负载均衡)功能
  2. 对python装饰器几种常见方式的使用与理解
  3. JAVA--虚函数,抽象函数,抽象类,接口
  4. A20 文件系统预装APK
  5. LeetCode 42. 接雨水(双指针、单调栈)
  6. pandas 对某一行标准化_Python中的神器Pandas,但是有人说Pandas慢...
  7. BZOJ 3529 数表(莫比乌斯+树状数组)
  8. 反射实例化不同类型的实例
  9. 微信小程序 云开发 生成带参数小程序二维码
  10. Atitit java文件监控 WatchService 的使用 目录 1. // 处理下级多层目录 1 2. // 处理新目录 1 3. Code 2 常见问题对于 1.// 处理下级多层目
  11. 解决Hbuliderx的代码不能自动补全的问题
  12. Android fragment原因,Android总结之Fragment
  13. PDA扫描 Geenk scan 的方法列表
  14. 交换机和路由器技术-28-OSPF的NSSA区域
  15. arcmap10.7打开tif文件一片空白 | 解决方法
  16. 岗位-iOS开发工程师-总结
  17. layui自定义新增tab页方法
  18. 宝元系统通讯软件recon_企业即时通讯系统拥有哪些二次开发能力?
  19. 如何将图片变成GIF图?一键完成gif制作
  20. android rtmp推流,使用MediaCodec和RTMP做直播推流

热门文章

  1. 部署OpenShift3.10版
  2. 领域驱动设计(DDD)及方法论
  3. 如何把ACCESS的数据导入到Mysql中
  4. 服务器批量管理,怎样同时管理很多台服务器
  5. NOD32 一般编译错误
  6. 最热门的国外软件外包网站freelancer.com
  7. Spring Boot Thymeleaf(十一)
  8. 什么是cdn服务器,CDN加速服务器优势?
  9. 想跳槽涨薪的必看!手机java编程软件
  10. html5哪个属性规定输入字段是必填的,HTML5期末考试题(卷)型