返回顶部
首页 > 资讯 > 后端开发 > JAVA >在java中实现视频处理及播放功能详解
  • 612
分享到

在java中实现视频处理及播放功能详解

java音视频开发语言 2023-09-08 07:09:19 612人浏览 薄情痞子
摘要

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

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

一. 需要了解的技术点

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

FFmpeg

FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的。 FFmpeg在linux平台下开发,但它同样也可以在其它操作系统环境中编译运行,包括windowsMac 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格式的文件,实现代码如下所示:

  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格式的文件,实现代码如下所示:

    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";  }    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页面中,把处理好的视频嵌入进来,供用户流量播放。

 

来源地址:https://blog.csdn.net/GUDUzhongliang/article/details/131537752

--结束END--

本文标题: 在java中实现视频处理及播放功能详解

本文链接: https://lsjlt.com/news/399522.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作