<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
抽幀(frame extraction)是指從視訊流中提取一些特定的幀,通常是關鍵幀或者隨機幀,以供後續處理。對於m3u8直播流,可以使用Java中的FFmpeg庫來實現抽幀功能。
FFmpeg是一套可以用來記錄、轉換數位音訊、視訊,並能將其轉化為流的開源計算機程式。採用LGPL或GPL許可證。它提供了錄製、轉換以及流化音視訊的完整解決方案。
JavaCV 是一款基於JavaCPP 呼叫方式,由多種開源計算機視覺庫組成的包裝庫,封裝了包含FFmpeg、OpenCV、tensorflow、caffe、tesseract、libdc1394、OpenKinect、videoInput和ARToolKitPlus等在內的計算機視覺領域的常用庫和實用程式類。
使用 Java 中的 FFmpeg 庫實現的最簡單的抽幀。
<dependency> <groupId>org.bytedeco</groupId> <artifactId>javacv</artifactId> <version>1.4.1</version> </dependency>
import org.bytedeco.javacv.*; import java.io.IOException; public class FrameExtractor { public static void main(String[] args) throws IOException, FrameGrabber.Exception, FrameRecorder.Exception { FFmpegFrameGrabber grabber = new FFmpegFrameGrabber("直播流地址xxx.m3u8"); grabber.setOption("rtsp_transport", "tcp"); grabber.start(); Frame frame; Java2DFrameConverter converter = new Java2DFrameConverter(); int i = 0; // grabber.grabImage() 獲取幀圖片,不包含音訊 // grabber.grab() 包含音訊 while ((frame = grabber.grabImage()) != null) { // 在這裡處理抽取到的幀 // 例如,將幀儲存為影象檔案 converter.convert(frame).createGraphics().dispose(); String outputFilename = "frame_" + i + ".jpg"; File f = new File(outputFilename); if(!f.exists())f.mkdirs(); ImageIO.write(converter.convert(frame), "jpg", f); i++; } grabber.stop(); } }
什麼是影格率:每秒重新整理幾次就是幾幀。例如25幀就是每秒展示25張圖片。
指定每幾秒抽取幾幀。這裡的核心思想是,平均數累加。
假設對影格率為25的視訊。要實現每3秒抽3幀。
設:影格率=fps;時間=t;t時間內抽取總幀數=x;
avg=(fps.t)/x;
只需找出 1*avg,2*avg,...,x*avg分別對應的值就找到了需要抽取的幀。
最後只需要使用一個變數對影格率計數。在指定的影格率進行抽取操作就可以了。
程式碼:
public class FrameExtractor { public static void main(String[] args) throws IOException, FrameGrabber.Exception, FrameRecorder.Exception { // 讀取流 FFmpegFrameGrabber grabber = new FFmpegFrameGrabber("http:.m3u8"); grabber.setOption("rtsp_transport", "tcp"); grabber.start(); Frame frame; Java2DFrameConverter converter = new Java2DFrameConverter(); // 控制讀取幀數 int frameRate = (int) grabber.getFrameRate(); int targetFrameRateNum[] = {10,10}; //(每10秒讀10幀) 目標影格率數量,每幾秒鐘讀取幾幀 SortedSet<Integer> targetFrameRate = new TreeSet<>(); // 需要抽取的目標影格率 // 計算需要抽取的目標幀 int calFrameRate = frameRate * targetFrameRateNum[0]; int partSize = calFrameRate / targetFrameRateNum[1]; int remainder = calFrameRate % targetFrameRateNum[1]; int current = 1; for (int i = 0; i < targetFrameRateNum[1]; i++) { // 避免出現幀數多一個 if (current <= calFrameRate){ targetFrameRate.add(current); } current += partSize; if (i < remainder) { current++; } } // 計數器 int frameCount = 0; int i = 0; while ((frame = grabber.grabImage()) != null) { // 每讀取一幀,增加計數器 frameCount++; // 如果計數器達到目標影格率,則進行處理 if (targetFrameRate.contains(frameCount)) { // 處理抽取到的幀 } // 重置計數器 if (calFrameRate == frameCount){ frameCount = 0; } } grabber.stop(); } }
到此這篇關於詳解如何用Java實現對m3u8直播流抽幀的文章就介紹到這了,更多相關Java m3u8直播流抽幀內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45