ffmpeg 截图太模糊了_通过ffmpeg实现视频流截图
最近忙于新產(chǎn)品技術(shù)點(diǎn)突破,針對(duì)架構(gòu)摸索暫時(shí)停住。目前需要解決的問題是如何從視頻流中截取一張圖。
概況
在安防領(lǐng)域有各種視頻監(jiān)控產(chǎn)品,它們遵循的通訊協(xié)議也不盡相同,歸納起來主要遵循GB/T 28181、ONVIF、PSIA等協(xié)議。
GB/T 28181協(xié)議
其通信協(xié)議如下所示
通信協(xié)議結(jié)構(gòu)圖.png
其視頻編碼格式主要有:MPEG-4、H.264、SVAC等,目前主流的視頻編碼格式是H.264。
其實(shí)時(shí)傳輸協(xié)議為RTP,在此傳輸協(xié)議基礎(chǔ)上對(duì)視音頻數(shù)據(jù)進(jìn)行封裝,其又分為PS封裝和非PS封裝:
基于RTP的PS封裝,是將視音頻流封裝成PS包,再將PS包以負(fù)載的方式封裝成RTP包。
基于RTP的非PS封裝,是直接將視音頻流以負(fù)載的方式封裝成RTP包。
如果對(duì)RTP協(xié)議感興趣可以參考:
RTP協(xié)議分析
RTSP/RTP/RTCP詳解整理
RTP協(xié)議全解析(H264碼流和PS流)
RTP/RTSP/RTCP有什么區(qū)別?
Wireshark 抓包分析 RTSP/RTP/RTCP 基本工作過程
公司裝有一臺(tái)宇視的電警卡口抓拍機(jī)HC161智能交通600萬攝像單元,可以看出該電警搭載的網(wǎng)絡(luò)攝像頭支持ONVIF、GB/T28181等協(xié)議,同時(shí)查看其視頻配置
視頻配置.png
可以嘗試通過VLC連接RTSP視頻流
vlc.png
安裝ffmpeg
在CentOS7上安裝ffmpeg
yum -y install epel-release
rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro
rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-1.el7.nux.noarch.rpm
yum search ffmpeg
yum -y install ffmpeg ffmpeg-devel
ffmpeg -version
version.png
ffmpeg -y -i rtsp://user:password@ip:port-ss 00:00:01 -vframes 1 -f image2 -vcodec png image.png
image.png
Java調(diào)用腳本
腳本正確調(diào)用,接下來就通過Java調(diào)用遠(yuǎn)程服務(wù)器上腳本實(shí)現(xiàn)視頻流截圖,在此借助Ganymed SSH-2 for Java,實(shí)現(xiàn)SSH遠(yuǎn)程執(zhí)行腳本。
package com.dhl.runshell;
import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.Session;
import ch.ethz.ssh2.StreamGobbler;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
/**
* Created by daihl on 2017/10/10.
*/
public class CommandRunner {
public static Connection getOpenedConnection(String host, String username, String password) throws IOException {
Connection conn = new Connection(host);
conn.connect(); // make sure the connection is opened
boolean isAuthenticated = conn.authenticateWithPassword(username, password);
if (isAuthenticated == false)
throw new IOException("Authentication failed.");
return conn;
}
public static String execShellScript(String host, String username,
String password,
String cmd, int port) throws IOException {
Connection conn = null;
Session sess = null;
InputStream stdout = null;
BufferedReader br = null;
StringBuffer buffer = new StringBuffer("exec result:");
buffer.append(System.getProperty("line.separator"));// 換行
try {
conn = getOpenedConnection(host, username, password);
sess = conn.openSession();
sess.execCommand(cmd);
stdout = new StreamGobbler(sess.getStdout());
br = new BufferedReader(new InputStreamReader(stdout));
while (true) {
// attention: do not comment this block, or you will hit
// NullPointerException
// when you are trying to read exit status
String line = br.readLine();
if (line == null)
break;
buffer.append(line);
buffer.append(System.getProperty("line.separator"));// 換行
}
} finally {
sess.close();
conn.close();
}
return buffer.toString();
}
public static void main(String[] args) {
String cmd = "ffmpeg -y -i rtsp://user:password@ip:port -ss 00:00:01 -vframes 1 -f image2 -vcodec png image.png;echo end";
try {
String info = CommandRunner.execShellScript("ip", "user",
"password",cmd,22);
System.out.println("info is:"+info);
} catch (IOException e) {
e.printStackTrace();
}
}
}
后繼工作
通過SSH遠(yuǎn)程執(zhí)行腳本有點(diǎn)簡(jiǎn)單粗暴,何不將這截圖功能做成服務(wù),向外發(fā)布,更加靈活方便。故后期工作如下:
準(zhǔn)備一臺(tái)圖片服務(wù)器,其主要職責(zé)有
1.圖片文件存儲(chǔ)
2.響應(yīng)終端的抓圖請(qǐng)求,并將圖片保存到指定文件夾目錄下
3.響應(yīng)終端的合圖請(qǐng)求,以上兩者做成服務(wù)的形式,終端通過分布式調(diào)用服務(wù),完成操作并返回結(jié)果狀態(tài)
4.接收終端上傳的圖片
硬件需求:
1.因圖片服務(wù)器上安裝ffmpeg工具,其需要對(duì)視頻流進(jìn)行解碼,并按照png格式組織編碼,對(duì)計(jì)算性能要求高,所以CPU性能要好
2.作為圖片文件存儲(chǔ)服務(wù)器,存儲(chǔ)容量要大
3.接受多終端設(shè)備連接,網(wǎng)口帶寬要大
后記
因?yàn)橐邮辗答伣Y(jié)果,cmd命令可以這樣寫
rtsp://user:password@ip:port -ss 00:00:01 -vframes 1 -f image2 -vcodec png image.png && echo succeeded ||echo failed
當(dāng)ffmpeg執(zhí)行正確時(shí),會(huì)輸出succeeded,當(dāng)ffmpeg不能正確執(zhí)行時(shí),會(huì)輸出failed
新建目錄文件夾,將截圖文件放入指定文件夾中
if [ ! -d /home/daihl/$(date +%Y%m%d) ]; then mkdir -p /home/daihl/$(date +%Y%m%d)&&echo "mkdir"; fi
總結(jié)
以上是生活随笔為你收集整理的ffmpeg 截图太模糊了_通过ffmpeg实现视频流截图的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 西门子基于RS485通讯恒压供水一拖二S
- 下一篇: svn 1.12.0 版本以及汉化包