最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java中實(shí)現(xiàn)視頻處理以及播放功能代碼詳解

 更新時(shí)間:2023年09月01日 11:37:36   作者:千鋒教育官方  
這篇文章主要給大家介紹了關(guān)于java中實(shí)現(xiàn)視頻處理以及播放功能的相關(guān)資料,最近要實(shí)現(xiàn)一套音視頻播放程序,所以這里給大家總結(jié)下,需要的朋友可以參考下

前言

我們知道,現(xiàn)在視頻可以說(shuō)是最火爆的多媒體手段了,所以順帶著視頻處理技術(shù)也就成了目前炙手可熱的技術(shù)之一了。我們作為一個(gè)Java程序員,又該怎么處理視頻呢?今天Java架構(gòu)棧就給大家講解一下,如何通過(guò)Java代碼來(lái)實(shí)現(xiàn)視頻處理及播放。

一. 需要了解的技術(shù)點(diǎn)

在具體實(shí)現(xiàn)之前,我們先來(lái)看看視頻處理需要了解的技術(shù)點(diǎn)都有哪些。

FFmpeg

FFmpeg是一套可以用來(lái)記錄、轉(zhuǎn)換數(shù)字音頻、視頻,并能將其轉(zhuǎn)化為流的開(kāi)源計(jì)算機(jī)程序。采用LGPL或GPL許可證。它提供了錄制、轉(zhuǎn)換以及流化音視頻的完整解決方案。它包含了非常先進(jìn)的音頻/視頻編解碼庫(kù)libavcodec,為了保證高可移植性和編解碼質(zhì)量,libavcodec里很多code都是從頭開(kāi)發(fā)的。 FFmpeg在Linux平臺(tái)下開(kāi)發(fā),但它同樣也可以在其它操作系統(tǒng)環(huán)境中編譯運(yùn)行,包括Windows、Mac OS X等。這個(gè)項(xiàng)目最早由Fabrice Bellard發(fā)起,2004年至2015年間由Michael Niedermayer主要負(fù)責(zé)維護(hù)。許多FFmpeg的開(kāi)發(fā)人員都來(lái)自MPlayer項(xiàng)目,而且當(dāng)前FFmpeg也是放在MPlayer項(xiàng)目組的服務(wù)器上。項(xiàng)目的名稱(chēng)來(lái)自MPEG視頻編碼標(biāo)準(zhǔn),前面的"FF"代表"Fast Forward"。 [1] FFmpeg編碼庫(kù)可以使用GPU加速。

HLS

HLS(HTTP Live Streaming)是Apple的動(dòng)態(tài)碼率自適應(yīng)技術(shù)。主要用于PC和Apple終端的音視頻服務(wù)。包括一個(gè)m3u8的索引文件,TS媒體分片文件和key加密串文件。

HLS的工作原理:將視頻文件分成多個(gè)ts格式的小文件,通過(guò)m3u8格式的索引文件對(duì)這些ts小文件組織索引。播放器可以通過(guò)連接m3u8文件播放視頻,當(dāng)要快進(jìn)時(shí)可以通過(guò)m3u8這個(gè)索引文件找到對(duì)應(yīng)的小文件,并去下載對(duì)應(yīng)的ts文件,最終可以實(shí)現(xiàn)快進(jìn)、快退、實(shí)時(shí)播放等功能。

m3u8所以文件和ts小文件可以讓FFmpeg幫我們生成。

video.js 網(wǎng)絡(luò)播放器

Video.js是一個(gè)為HTML5世界從頭開(kāi)始構(gòu)建的網(wǎng)絡(luò)視頻播放器。它支持HTML5視頻和現(xiàn)代流媒體格式,它支持桌面和移動(dòng)設(shè)備上的視頻播放。該項(xiàng)目于2010年中期啟動(dòng),目前已有數(shù)百名撰稿人,在450000多個(gè)網(wǎng)站上使用。

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

二. 具體實(shí)現(xiàn)步驟

了解完上面的這些基本理論知識(shí)后,接下來(lái)咱們就來(lái)看看該如何進(jìn)行代碼實(shí)現(xiàn)吧。

使用ffmpeg將錄制的avi格式文件生成MP4文件

我們可以把a(bǔ)vi格式的文件轉(zhuǎn)為mp4格式的文件,實(shí)現(xiàn)代碼如下所示:

/**
生成avi文件生成mp4文件
@param ffmpeg_path ffmpeg的安裝路徑:C:\Program Files\ffmpeg-master-latest-win64-gpl-shared\bin\ffmpeg.exe
@param video_path 要轉(zhuǎn)化的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
  // 通過(guò) ProcessBuilder 執(zhí)行 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";
  }
  }
  /**

獲取進(jìn)程執(zhí)行結(jié)果

*/
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秒,最長(zhǎng)執(zhí)行時(shí)間5分種
int count = 0;
while (!finished) {
//超過(guò)5分鐘,默認(rèn)失敗
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格式的文件轉(zhuǎn)換為m3u8/ts格式的文件,實(shí)現(xiàn)代碼如下所示:

  /**
  生成m3u8文件
  @param ffmpeg_path ffmpeg的安裝路徑:C:\Program Files\ffmpeg-master-latest-win64-gpl-shared\bin\ffmpeg.exe
  @param video_path 要轉(zhuǎn)化的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();
  }
  //通過(guò)檢查生成的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網(wǎng)絡(luò)視頻播放器播放視頻

我們也可以在html頁(yè)面中,把處理好的視頻嵌入進(jìn)來(lái),供用戶(hù)流量播放。

總結(jié) 

到此這篇關(guān)于java中實(shí)現(xiàn)視頻處理以及播放功能的文章就介紹到這了,更多相關(guān)java視頻處理及播放內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java之Springcloud Feign組件詳解

    Java之Springcloud Feign組件詳解

    這篇文章主要介紹了Java之Springcloud Feign組件詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • java.sql.SQLNonTransientConnectionException: Public Key Retrieval is not allowed

    java.sql.SQLNonTransientConnectionException: Public&nbs

    本文主要介紹了java.sql.SQLNonTransientConnectionException: Public Key Retrieval is not allowed錯(cuò)誤的問(wèn)題解決,下面就來(lái)介紹幾種解決方法,感興趣的可以了解一下
    2025-05-05
  • rocketmq client 日志的問(wèn)題處理方式

    rocketmq client 日志的問(wèn)題處理方式

    這篇文章主要介紹了rocketmq client 日志的問(wèn)題處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • SpringBoot自動(dòng)化配置綁定的項(xiàng)目實(shí)踐

    SpringBoot自動(dòng)化配置綁定的項(xiàng)目實(shí)踐

    本文介紹了將遺留項(xiàng)目中的Properties硬編碼配置改造為SpringBoot的@ConfigurationProperties自動(dòng)化配置的過(guò)程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2026-03-03
  • Java中結(jié)束循環(huán)的方法

    Java中結(jié)束循環(huán)的方法

    這篇文章主要介紹了Java中結(jié)束循環(huán)的方法,文中有段代碼在return,結(jié)束了整個(gè)main方法,即使輸出hello world的語(yǔ)句位于循環(huán)體外,也不會(huì)被執(zhí)行,對(duì)java結(jié)束循環(huán)方法感興趣的朋友跟隨小編一起看看吧
    2023-06-06
  • Java struts2捕獲404錯(cuò)誤的方法匯總

    Java struts2捕獲404錯(cuò)誤的方法匯總

    這篇文章主要為大家詳細(xì)匯總了Java struts2捕獲404錯(cuò)誤的常用方法,感興趣的小伙伴們可以參考一下
    2016-05-05
  • Java刪除二叉搜索樹(shù)的任意元素的方法詳解

    Java刪除二叉搜索樹(shù)的任意元素的方法詳解

    這篇文章主要介紹了Java刪除二叉搜索樹(shù)的任意元素的方法,結(jié)合實(shí)例形式詳細(xì)分析了java這對(duì)二叉搜索樹(shù)的遍歷、查找、刪除等相關(guān)操作技巧與使用注意事項(xiàng),需要的朋友可以參考下
    2020-03-03
  • springBoot集成mybatis 轉(zhuǎn)換為 mybatis-plus方式

    springBoot集成mybatis 轉(zhuǎn)換為 mybatis-plus方式

    這篇文章主要介紹了springBoot集成mybatis 轉(zhuǎn)換為 mybatis-plus方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java使用FastExcel實(shí)現(xiàn)合并單元格

    Java使用FastExcel實(shí)現(xiàn)合并單元格

    FastExcel 是一個(gè)采用純 java 開(kāi)發(fā)的 excel 文件讀寫(xiě)組件,支持 Excel'97(-2003)(BIFF8)文件格式,本文主要介紹了如何使用FastExcel實(shí)現(xiàn)合并單元格,需要的可以參考下
    2024-12-12
  • Java基礎(chǔ)鞏固抽象類(lèi)與接口詳解

    Java基礎(chǔ)鞏固抽象類(lèi)與接口詳解

    在類(lèi)中沒(méi)有包含足夠的信息來(lái)描繪一個(gè)具體的對(duì)象,這樣的類(lèi)稱(chēng)為抽象類(lèi),接口是Java中最重要的概念之一,它可以被理解為一種特殊的類(lèi),不同的是接口的成員沒(méi)有執(zhí)行體,是由全局常量和公共的抽象方法所組成,本文給大家介紹Java抽象類(lèi)和接口,感興趣的朋友一起看看吧
    2022-05-05

最新評(píng)論

乐都县| 竹溪县| 赤水市| 理塘县| 塘沽区| 张家界市| 米易县| 南康市| 惠州市| 密云县| 赣榆县| 娱乐| 沾益县| 湾仔区| 扶余县| 分宜县| 宜章县| 乌海市| 阿拉善右旗| 沁阳市| 清丰县| 米易县| 孝感市| 松阳县| 元氏县| 神池县| 阿克陶县| 黄浦区| 白银市| 雅安市| 雅江县| 浙江省| 图们市| 邢台市| 兴安县| 澳门| 绥宁县| 大埔县| 任丘市| 海丰县| 凯里市|