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

这篇具有很好参考价值的文章主要介绍了在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,音视频,开发语言

 文章来源地址https://www.toymoban.com/news/detail-546787.html

到了这里,关于在java中实现视频处理及播放功能详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java如何整合FFmpeg、FFprobe等音视频处理工具,零基础照样玩

    最后奉上工具的学习资料(感兴趣的可以看看),废话不多说!!!!! FFmpeg是啥 :​ ffmpeg(命令行工具) 是一个快速的音视频转换工具。 FFmpeg能干啥 :如果你用过爱剪辑的话或者其他一些音视频处理软件的话,你可以理解他们能做的你用玩意都能做。 为啥要用FFmpeg :开源

    2024年02月02日
    浏览(77)
  • Java中实现PDF转图片功能工具类代码详解

    以下是使用 Java 将 PDF 转换为图片的工具类示例,并且包含了测试方法: 解释: 首先,我们定义了一个 PDFToImageConverter 工具类,其中包含了 convert() 方法,用于将 PDF 转换为图片。 在 convert() 方法中,我们使用 PDFBox 库加载 PDF 文件,创建 PDF 渲染器,并将每一页 PDF 转换为 B

    2024年02月08日
    浏览(47)
  • 【音视频笔记】Mediacodec+Muxer生成mp4,浏览器无法播放问题处理

    最近在测试视频录制功能时发现,AudioRecord + MediaCodec + MediaMuxer生成的MP4,PC浏览器无法播放 ,但是Android、Windows、Mac的播放器应用都能正常播放。虽然不禁想吐槽浏览器视频组件的容错性差,但我也意识生成的文件格式肯定也是有问题的。 然后尝试了合成MP4视频时,只保留视

    2024年02月07日
    浏览(99)
  • 在unity中实现视频的暂停播放和拖拽进度条的功能

    #Unity中实现视频的暂停播放和拖拽进度条的功能 在UI上,视频包含一个播放、暂停和停止按钮,以及一个拖动条,可以使用这些按钮来控制视频的播放,使用拖动进度条来调整视频的播放进度。 1.建立一个UI,导入视频素材,然后将视频拖放到场景中。 2.建立一个Canvas对象作

    2024年02月07日
    浏览(47)
  • Java视频流提取与播放技术详解

    摘要:本文介绍了在Java中如何使用Java Media Framework(JMF)库提取和播放视频流的技术。通过讲解JMF库的概念、用法和相关案例,帮助读者理解和掌握在Java中处理视频流的技术。同时,提供练习题和总结,加深对所学知识的理解。 Java Media Framework(JMF)是一个用于处理音频、视

    2024年04月22日
    浏览(43)
  • 【音视频处理】音频编码AAC详解,低码率提高音质?

    大家好,欢迎来到停止重构的频道。 本期我们介绍 音频编码格式AAC 。 AAC是音频最常用的编码格式之一 ,几乎所有的播放器都支持这个编码格式。 其他音频编码格式都是类似的,只是某些细节存在差别,如压缩算法、某些音频参数存在限制等。 我们按这样的顺序讨论 :

    2024年02月09日
    浏览(91)
  • 如何在微信小程序中实现音视频通话

    微信小程序的音视频通话可以通过微信提供的实时音视频能力实现。这个能力包括了音视频采集、编码、传输和解码等多个环节,开发者只需要使用微信提供的 API 接口就可以轻松地实现音视频通话功能。 在具体实现上,开发者需要先在微信开放平台上注册并创建小程序,然

    2023年04月09日
    浏览(53)
  • 【音视频处理】RTMP、HLS、HTTP-FLV、WebRTC、RTSP的区别?直播协议详解

      大家好,欢迎来到停止重构的频道。 本期我们详细讨论 直播的相关协议 ,包括:HTTP-FLV、HLS、RTMP、Web-RTC、RTSP等等。 我们将会详细介绍这些协议的工作原理、应用场景、及延迟的原因。 我们按这样的顺序讨论​ 1、  RTMP、HTTP-FLV  2、  HLS  3、  Web-RTC  4、  RTSP  RTM

    2024年02月02日
    浏览(48)
  • 【音视频】如何播放rtsp视频流

    现阶段直播越来越流行,直播技术发展也越来越快。Webrtc和rtsp是比较火热的技术,而且应用也比较广泛。本文通过实践来展开介绍关于rtsp、webrtc的使用过程。 本文重点介绍如何播放rtsp视频流,通过ffplay方式以及VLC media player的方式来播放 可以参考上一篇博文:【音视频】基于

    2024年01月19日
    浏览(97)
  • qt+ffmpeg 实现音视频播放(二)之音频播放

    通过  avformat_open_input () 打开媒体文件并分配和初始化  AVFormatContext   结构体。 函数原型如下: int avformat_open_input(AVFormatContext **ps, const char *url, AVInputFormat *fmt, AVDictionary **options); 参数说明: - `ps`:指向 `AVFormatContext` 结构体指针的指针,用于存储打开的媒体文件的信息。

    2024年04月22日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包