当前位置: 首页 > news >正文

java 视频解析_ffmpeg解析视频的每一帧(java )

前置条件:下载opencv的jar包导入。ffmpeg

package test;

import org.opencv.core.Core;

import org.opencv.core.Mat;

import org.opencv.imgcodecs.Imgcodecs;

import org.opencv.videoio.VideoCapture;

import com.googlecode.javacv.cpp.opencv_highgui;

public class DecodeVideo {

public static void main(String[] args) {

System.loadLibrary("opencv_ffmpeg330_64");

// 加载本地的OpenCV库,这样就可以用它来调用Java API

System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

run2();

}

public static void run2() {

// 读取视频文件

VideoCapture cap = new VideoCapture("F:/mysour/csdn/2.mp4");

System.out.println(cap.isOpened());

// 判断视频是否打开

if (cap.isOpened()) {

// 总帧数

double frameCount = cap.get(opencv_highgui.CV_CAP_PROP_FRAME_COUNT);

System.out.println("视频总帧数:" + frameCount);

// 帧率

double fps = cap.get(opencv_highgui.CV_CAP_PROP_FPS);

System.out.println("视频帧率" + fps);

// 时间长度

double len = frameCount / fps;

System.out.println("视频总时长:" + len);

Double d_s = new Double(len);

System.out.println(d_s.intValue());

Mat frame = new Mat();

for (int i = 0; i < d_s.intValue(); i++) {

// 设置视频的位置(单位:毫秒)

cap.set(opencv_highgui.CV_CAP_PROP_POS_MSEC, i * 1000);

// 读取下一帧画面

if (cap.read(frame)) {

System.out.println("正在保存");

// 保存画面到本地目录

Imgcodecs.imwrite("F:/mysour/video/output/" + i + ".jpg", frame);

}

}

// 关闭视频文件

cap.release();

}

}

}

ffmpeg默认可以加载avi格式的视频,

如果想要加载MP4格式的视频的话,需要在local.library.path路径下放置ffmpeg.dll文件。

本段java实现截取视频,每一秒截取一帧作为jpg图片保存在本地。

效果如下:

0818b9ca8b590ca3270a3433284dd417.png

接下来,我在研究能不能把解析的图片再合成一个视频来播放。

如果有实现的大神请不吝赐教,小弟一定虚心学习。

网上找了资料,实现了图片转视频:

package test;

import java.io.File;

import java.io.IOException;

import java.util.Arrays;

import java.util.Comparator;

import org.jim2mov.core.DefaultMovieInfoProvider;

import org.jim2mov.core.ImageProvider;

import org.jim2mov.core.Jim2Mov;

import org.jim2mov.core.MovieInfoProvider;

import org.jim2mov.core.MovieSaveException;

import org.jim2mov.utils.MovieUtils;

/**

* 图片与视频转换工具类

*

* @author Administrator

*/

public class makeVideo {

/**

* 将图片转换成视频

* @param jpgDirPath jpg图片文件夹绝对路径

* @param aviFileName 生成的avi视频文件名

* @param fps 每秒帧数

* @param mWidth 视频的宽度

* @param mHeight 视频的高度

* @throws Exception

*/

public static void convertPicToAvi(String jpgDirPath, String aviFileName, int fps, int mWidth, int mHeight) {

// jpgs目录放置jpg图片,图片文件名为(1.jpg,2.jpg...)

final File[] jpgs = new File(jpgDirPath).listFiles();

if(jpgs==null || jpgs.length==0){

return;

}

// 对文件名进行排序(本示例假定文件名中的数字越小,生成视频的帧数越靠前)

Arrays.sort(jpgs, new Comparator() {

public int compare(File file1, File file2) {

String numberName1 = file1.getName().replace(".jpg", "");

String numberName2 = file2.getName().replace(".jpg", "");

return new Integer(numberName1) - new Integer(numberName2);

}

});

// 生成视频的名称

DefaultMovieInfoProvider dmip = new DefaultMovieInfoProvider(aviFileName);

// 设置每秒帧数

dmip.setFPS(fps>0?fps:3); // 如果未设置,默认为3

// 设置总帧数

dmip.setNumberOfFrames(jpgs.length);

// 设置视频宽和高(最好与图片宽高保持一直)

dmip.setMWidth(mWidth>0?mWidth:1440); // 如果未设置,默认为1440

dmip.setMHeight(mHeight>0?mHeight:860); // 如果未设置,默认为860

try {

new Jim2Mov(new ImageProvider() {

public byte[] getImage(int frame) {

try {

// 设置压缩比

return MovieUtils.convertImageToJPEG((jpgs[frame]), 1.0f);

} catch (IOException e) {

System.err.println(e);

}

return null;

}

}, dmip, null).saveMovie(MovieInfoProvider.TYPE_AVI_MJPEG);

} catch (MovieSaveException e) {

System.err.println(e);

}

System.out.println("create avi success.");

}

/**

* main

* @param args

* @throws Exception

*/

public static void main(String[] args) throws Exception {

String jpgDirPath = "F:/mysour/video/output/"; // jpg文件夹路径

String aviFileName = "test.avi"; // 生成的avi视频文件名(生成路径为本工程)

int fps = 3; // 每秒播放的帧数

int mWidth = 1440; // 视频的宽度

int mHeight = 860; // 视频的高度

makeVideo.convertPicToAvi(jpgDirPath, aviFileName, fps, mWidth, mHeight);

}

}

这里需要两个jar包。

Jim2mov.jar、jmf.jar。

生成的avi文件在工程目录下。

0818b9ca8b590ca3270a3433284dd417.png

有个问题,生成的视频不能打开,浏览器报编码问题。

具体还要排查。


http://www.taodudu.cc/news/show-4974419.html

相关文章:

  • 旋风解析磁力php,梦见旋风磁力好不好?
  • remixpacks.club无法访问解决方案(基于Python的base64磁力链接地址解析)
  • UI设计流行框架、学习路线图教程,最新意派基础讲解
  • Epub360教你如何制作报纸翻页式创意招聘H5?
  • 360 序列帧html生成工具,1.gif导出为序列帧
  • UI设计最新意派基础视频教程全套资源
  • 意派epub360 html 代码,意派Epub360丨不用代码,不用定制,你也可以自己制作DIY类H5啦!...
  • 招聘H5页面模板看Epub360,助你快速生成创意H5
  • 放弃哪吒造车增资,360的“智能汽车网络安全”牌不好打
  • Epub360教你招聘H5页面设计与制作
  • 如何使用Epub360制作炫酷的邀请函类型H5页面
  • 旋转:唱片旋转效果
  • 360 se html document 广告,意派Epub360丨父亲节借势营销H5,哪一个打动了你?
  • 意派Epub360 | 制作微信H5页面的流程思路引导
  • 意派epub360:细说交互视频H5的前世今生
  • 意派epub360 html 代码,意派Epub360丨怎么制作在线知识答题H5?一起来学经验!
  • 微信公众号在线编辑器
  • 微信文章编辑器
  • 程序员的专属微信公众号编辑器:定制 Markdown 转 HTML
  • zmq丢消息
  • ZMQ 完全指南--让你跟快捷的进入状态
  • linux zmq环境配置,zmq安装与使用
  • zmq java 消息阻塞_ZMQ的三种消息模式
  • c++工程,zmq
  • zmq远程画面显示
  • java zmq api_zmqSocket 使用和相关java后台准备
  • zmq的内部结构
  • ZMQ应用
  • zmq php使用,php zmq 扩展
  • ZMQ安装