java中实现视频处理以及播放功能代码详解

 更新时间:2023年09月01日 11:37:36   作者:千锋教育官方  
这篇文章主要给大家介绍了关于java中实现视频处理以及播放功能的相关资料,最近要实现一套音视频播放程序,所以这里给大家总结下,需要的朋友可以参考下

前言

我们知道,现在视频可以说是最火爆的多媒体手段了,所以顺带着视频处理技术也就成了目前炙手可热的技术之一了。我们作为一个Java程序员,又该怎么处理视频呢?今天Java架构栈就给大家讲解一下,如何通过Java代码来实现视频处理及播放。

一. 需要了解的技术点

在具体实现之前,我们先来看看视频处理需要了解的技术点都有哪些。

FFmpeg

FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的。 FFmpeg在Linux平台下开发,但它同样也可以在其它操作系统环境中编译运行,包括Windows、Mac OS X等。这个项目最早由Fabrice Bellard发起,2004年至2015年间由Michael Niedermayer主要负责维护。许多FFmpeg的开发人员都来自MPlayer项目,而且当前FFmpeg也是放在MPlayer项目组的服务器上。项目的名称来自MPEG视频编码标准,前面的"FF"代表"Fast Forward"。 [1] FFmpeg编码库可以使用GPU加速。

HLS

HLS(HTTP Live Streaming)是Apple的动态码率自适应技术。主要用于PC和Apple终端的音视频服务。包括一个m3u8的索引文件,TS媒体分片文件和key加密串文件。

HLS的工作原理:将视频文件分成多个ts格式的小文件,通过m3u8格式的索引文件对这些ts小文件组织索引。播放器可以通过连接m3u8文件播放视频,当要快进时可以通过m3u8这个索引文件找到对应的小文件,并去下载对应的ts文件,最终可以实现快进、快退、实时播放等功能。

m3u8所以文件和ts小文件可以让FFmpeg帮我们生成。

video.js 网络播放器

Video.js是一个为HTML5世界从头开始构建的网络视频播放器。它支持HTML5视频和现代流媒体格式,它支持桌面和移动设备上的视频播放。该项目于2010年中期启动,目前已有数百名撰稿人,在450000多个网站上使用。

官方地址:https://videojs.com/

二. 具体实现步骤

了解完上面的这些基本理论知识后,接下来咱们就来看看该如何进行代码实现吧。

使用ffmpeg将录制的avi格式文件生成MP4文件

我们可以把avi格式的文件转为mp4格式的文件,实现代码如下所示:

/**
生成avi文件生成mp4文件
@param ffmpeg_path ffmpeg的安装路径:C:\Program Files\ffmpeg-master-latest-win64-gpl-shared\bin\ffmpeg.exe
@param video_path 要转化的avi文件地址
@param mp4folder_path 生成的MP4存放路径
@param mp4_name 生成的MP4文件名
@return 成功返回ok,失败返回error
*/
  public String makeMp4(String ffmpeg_path,String video_path,String mp4folder_path,String mp4_name){
  //ffmpeg.exe -i qfedu.avi -c:v libx264 -s 1280x720 -pix_fmt yuv420p -b:a 63k -b:v 753k -r 18 .\qfedu.mp4
  // 通过 ProcessBuilder 执行 ffmpeg.exe
  List cmd = new ArrayList();
  cmd.add(ffmpeg_path);
  cmd.add("-i");
  cmd.add(video_path);
  cmd.add("-c:v");
  cmd.add("libx264");
  cmd.add("-y");
  cmd.add("-s");
  cmd.add("1280x720");
  cmd.add("-pix_fmt");
  cmd.add("yuv420p");
  cmd.add("-b:a");
  cmd.add("63k");
  cmd.add("-b:v");
  cmd.add("753k");
  cmd.add("-r");
  cmd.add("18");
  cmd.add(mp4folder_path + mp4_name );
  String outstring = null;
  try {
  ProcessBuilder builder = new ProcessBuilder();
  builder.command(cmd);
  builder.redirectErrorStream(true);
  Process process = builder.start();
  outstring = getProcessResult(process);
  System.out.println(outstring);
  return "ok";
  } catch (Exception ex) {
  ex.printStackTrace();
  return "error";
  }
  }
  /**

获取进程执行结果

*/
public String getProcessResult(Process process) {
String result = "error";
int exitValue = -1;
InputStream inputStream = null;
InputStream errorInputStream = null;
StringBuffer outputString = new StringBuffer();
try {
inputStream = process.getInputStream();
errorInputStream = process.getErrorStream();
boolean finished = false;
int max = 300;//每次休眠1秒,最长执行时间5分种
int count = 0;
while (!finished) {
//超过5分钟,默认失败
if (retry > max) {
return "error";
}
         try {
             while (inputStream.available() > 0) {
                 Character c = new Character((char) inputStream.read());
                 outputString.append(c);
                 System.out.print(c);
             }
             while (errorInputStream.available() > 0) {
                 Character c = new Character((char) errorInputStream.read());
                 outputString.append(c);
                 System.out.print(c);
             }
             exitValue = p.exitValue();
             finished = true;
         } catch (IllegalThreadStateException e) {
             Thread.currentThread().sleep(1000);//休眠1秒
             count++;
         }
     }
 } catch (Exception e) {
     e.printStackTrace();
 } finally {
     if (inputStream != null) {
         try {
             inputStream.close();
         } catch (IOException e) {
             System.out.println(e.getMessage());
         }
     }
 }
 return outputString.toString();

使用ffmpeg将MP4文件生成m3u8/ts文件

我们也可以把MP4格式的文件转换为m3u8/ts格式的文件,实现代码如下所示:

  /**
  生成m3u8文件
  @param ffmpeg_path ffmpeg的安装路径:C:\Program Files\ffmpeg-master-latest-win64-gpl-shared\bin\ffmpeg.exe
  @param video_path 要转化的mp4文件地址
  @param m3u8folder_path 生成m3u8的存放路径
  @param m3u8_name 生成的m3u8文件名
  @return 成功返回ok,失败返回error
  @return 成功则返回success,失败error
  /
  public String makeM3u8(String ffmpeg_path,String video_path,String m3u8folder_path,String m3u8_name) {
  /
  ffmpeg -i qfedu.mp4 -hls_time 10 -hls_list_size 0 -hls_segment_filename ./hls/qfedu_%05d.ts ./hls/qfedu.m3u8
  */
  List cmd = new ArrayList();
  cmd.add(ffmpeg_path);
  cmd.add("-i");
  cmd.add(video_path);
  cmd.add("-hls_time");
  cmd.add("10");
  cmd.add("-hls_list_size");
  cmd.add("0");
  cmd.add("-hls_segment_filename");
  cmd.add(m3u8folder_path + m3u8_name.substring(0, m3u8_name.lastIndexOf(".")) + "_%05d.ts");
  cmd.add(m3u8folder_path + m3u8_name);
  String out = null;
  try {
  ProcessBuilder processBuilder = new ProcessBuilder();
  processBuilder.command(cmd);
  processBuilder.redirectErrorStream(true);
  Process process = processBuilder.start();
  out = getProcessResult(process);
  System.out.println(out);
  } catch (Exception e) {
  e.printStackTrace();
  }
  //通过检查生成的m3u8的文件列表判断是否成功
  List tsList = getTsList(m3u8folder_path,m3u8_name);
  if (tsList == null) {
  return "error";
  }
  return "success";
  }
  /**
  获取ts列表
  @return ts列表
  */
  public List getTsList(String m3u8folder_path,String m3u8_name ) {
  List fileList = new ArrayList();
  List tsList = new ArrayList();
  String m3u8file_path = m3u8folder_path + m3u8_name;
  BufferedReader reader = null;
  String str = null;
  String line = "";
  try {
  reader = new BufferedReader(new FileReader(m3u8file_path));
  while ((str = reader.readLine()) != null) {
  line = str;
  if (line.endsWith(".ts")) {
  tsList.add(line);
  }
  }
  } catch (IOException e) {
  e.printStackTrace();
  } finally {
  if (reader != null) {
  try {
  reader.close();
  } catch (IOException e) {
  e.printStackTrace();
  }
  }
  }
  if (line.contains("#EXT-X-ENDLIST")) {
  fileList.addAll(tsList);
  return fileList;
  }
  return null;
  }

使用基于html5支持Video.js网络视频播放器播放视频

我们也可以在html页面中,把处理好的视频嵌入进来,供用户流量播放。

总结 

到此这篇关于java中实现视频处理以及播放功能的文章就介绍到这了,更多相关java视频处理及播放内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java、js中实现无限层级的树形结构方法(类似递归)

    java、js中实现无限层级的树形结构方法(类似递归)

    下面小编就为大家带来一篇java、js中实现无限层级的树形结构方法(类似递归)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-11-11
  • Spring jpa和mybatis整合遇到的问题解析

    Spring jpa和mybatis整合遇到的问题解析

    有朋友说jpa相比mybatis太难用,多表联合的查询写起来也比较费劲,所以便加入了mybatis的支持,在配置jpa时遇到各种问题,需要修改相关配置文件,下面小编给大家分享下修改配置文件的思路,感兴趣的朋友参考下
    2016-10-10
  • Spring中property-placeholder的使用与解析详解

    Spring中property-placeholder的使用与解析详解

    本篇文章主要介绍了Spring中property-placeholder的使用与解析详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • Java 十大排序算法之计数排序刨析

    Java 十大排序算法之计数排序刨析

    计数排序是一个非基于比较的排序算法,该算法于1954年由 Harold H. Seward 提出。它的优势在于在对一定范围内的整数排序时,它的复杂度为Ο(n+k)(其中k是整数的范围),快于任何比较排序算法
    2021-11-11
  • RabbitMQ下载与安装教程

    RabbitMQ下载与安装教程

    RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件),这篇文章给大家介绍RabbitMQ下载与安装教程,感兴趣的朋友跟随小编一起看看吧
    2024-02-02
  • Mybatis-Plus注入SQL原理分析

    Mybatis-Plus注入SQL原理分析

    本文主要介绍了Mybatis-Plus注入SQL原理分析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • 如何把Java程序窗口在屏幕中间显示

    如何把Java程序窗口在屏幕中间显示

    大家在日常Java开发中,可能会需要把程序窗口定位在屏幕中间,那该如何操作呢,下面来一起看看。
    2016-08-08
  • Java基础之逻辑运算符知识总结

    Java基础之逻辑运算符知识总结

    今天带大家学习Java基础知识,文中对Java逻辑运算符进行了非常详细的介绍,有相关代码示例,对正在学习java的小伙伴很有帮助,需要的朋友可以参考下
    2021-05-05
  • 基于Java内存溢出的解决方法详解

    基于Java内存溢出的解决方法详解

    本篇文章是对Java内存溢出的解决方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • MyBatisPlus 自定义sql语句的实现

    MyBatisPlus 自定义sql语句的实现

    这篇文章主要介绍了MyBatisPlus 自定义sql语句的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08

最新评论