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视频处理及播放内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!