Java解碼H264格式視頻流中的圖片
本文實(shí)例為大家分享了Java解碼H264格式視頻流中的圖片,供大家參考,具體內(nèi)容如下
引入依賴
<dependency> <groupId>org.bytedeco</groupId> <artifactId>javacv</artifactId> <version>1.4.3</version> </dependency> <dependency> <groupId>org.bytedeco.javacpp-presets</groupId> <artifactId>ffmpeg-platform</artifactId> <version>4.0.2-1.4.3</version> </dependency>
需要注意這兩個(gè)包之間的版本有一個(gè)對(duì)應(yīng)關(guān)系,如果版本不對(duì)應(yīng)可能會(huì)出問(wèn)題
解碼過(guò)程
實(shí)現(xiàn)的一個(gè)簡(jiǎn)單功能是:
- 從Socket獲取視頻輸入流(H264格式)
- 獲取視頻流中的幀
- 把每一幀轉(zhuǎn)換成 BufferedImage
package com.amwalle.walle.raspi.camera;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.Java2DFrameConverter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
public class CameraHandler implements Runnable {
private static final Logger logger = LoggerFactory.getLogger(CameraHandler.class);
private final String LOCK = "LOCK";
private Socket cameraSocket;
private static BufferedImage bufferedImage;
CameraHandler(Socket socket) throws IOException {
this.cameraSocket = socket;
}
String getLock() {
return LOCK;
}
@Override
public void run() {
try {
InputStream cameraStream = cameraSocket.getInputStream();
FFmpegFrameGrabber frameGrabber = new FFmpegFrameGrabber(cameraStream);
frameGrabber.setFrameRate(30);
frameGrabber.setFormat("h264");
frameGrabber.setVideoBitrate(15);
frameGrabber.setVideoOption("preset", "ultrafast");
frameGrabber.setNumBuffers(25000000);
frameGrabber.start();
Frame frame = frameGrabber.grab();
Java2DFrameConverter converter = new Java2DFrameConverter();
while (frame != null) {
BufferedImage bufferedImage = converter.convert(frame);
setBufferedImage(bufferedImage);
synchronized (LOCK) {
LOCK.notifyAll();
}
frame = frameGrabber.grab();
}
} catch (IOException e) {
logger.info("Video handle error, exit ...");
logger.info(e.getMessage());
}
}
private void setBufferedImage(BufferedImage image) {
bufferedImage = image;
}
BufferedImage getBufferedImage() {
return bufferedImage;
}
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Java IO流學(xué)習(xí)總結(jié)之文件傳輸基礎(chǔ)
- java8使用流的filter來(lái)篩選數(shù)據(jù)的實(shí)現(xiàn)
- Java Stream流之求和的實(shí)現(xiàn)
- java使用IO流對(duì)數(shù)組排序?qū)嵗v解
- java使用ffmpeg實(shí)現(xiàn)上傳視頻的轉(zhuǎn)碼提取視頻的截圖等功能(代碼操作)
- java使用ffmpeg處理視頻的方法
- 使用Java和ffmpeg把音頻和視頻合成視頻的操作方法
- java使用FFmpeg合成視頻和音頻并獲取視頻中的音頻等操作(實(shí)例代碼詳解)
- Java 使用 FFmpeg 處理視頻文件示例代碼詳解
- JavaCV獲取視頻文件時(shí)長(zhǎng)的方法
- Java使用OpenCV3.2實(shí)現(xiàn)視頻讀取與播放
- Java Red5服務(wù)器實(shí)現(xiàn)流媒體視頻播放
相關(guān)文章
SpringCloud OpenFeign與Ribbon客戶端配置詳解
在springcloud中,openfeign是取代了feign作為負(fù)載均衡組件的,feign最早是netflix提供的,他是一個(gè)輕量級(jí)的支持RESTful的http服務(wù)調(diào)用框架,內(nèi)置了ribbon,而ribbon可以提供負(fù)載均衡機(jī)制,因此feign可以作為一個(gè)負(fù)載均衡的遠(yuǎn)程服務(wù)調(diào)用框架使用2022-11-11
聊聊注解@controller@service@component@repository的區(qū)別
這篇文章主要介紹了聊聊注解@controller@service@component@repository的區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
java快速解析路徑中的參數(shù)(&與=拼接的參數(shù))
這篇文章主要介紹了java快速解析路徑中的參數(shù)(&與=拼接的參數(shù)),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-02-02
Spring事務(wù)失效場(chǎng)景原理及解決方案
這篇文章主要介紹了Spring事務(wù)失效場(chǎng)景原理及解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09

