前言:
本章基於javaCV實現收流器功能和錄制功能
補充:基於本功能可以實現遠程流媒體服務器實時視頻錄制到本地
一、開發所依賴的包(與上一章相同,具體依賴包請查看上一章)
本章使用windows環境開發,基於javaCV的基礎支撐包以及ffmpeg-3.1.2-1.2.jar、ffmpeg-3.1.2-1.2-windows-x86.jar、ffmpeg-3.1.2-1.2-windows-x86_64.jar;
二、代碼實現
本功能采用按幀實現收流器錄制功能
/**
* 按幀錄制視頻
*
* @param inputFile-該地址可以是網絡直播/錄播地址,也可以是遠程/本地文件路徑
* @param outputFile
* -該地址只能是文件地址,如果使用該方法推送流媒體服務器會報錯,原因是沒有設置編碼格式
* @throws FrameGrabber.Exception
* @throws FrameRecorder.Exception
* @throws org.bytedeco.javacv.FrameRecorder.Exception
*/
public static void frameRecord(String inputFile, String outputFile, int audioChannel)
throws Exception, org.bytedeco.javacv.FrameRecorder.Exception {
boolean isStart=true;//該變量建議設置為全局控制變量,用於控制錄制結束
// 獲取視頻源
FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(inputFile);
// 流媒體輸出地址,分辨率(長,高),是否錄制音頻(0:不錄制/1:錄制)
FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(outputFile, 1280, 720, audioChannel);
// 開始取視頻源
recordByFrame(grabber, recorder, isStart);
}
private static void recordByFrame(FFmpegFrameGrabber grabber, FFmpegFrameRecorder recorder, Boolean status)
throws Exception, org.bytedeco.javacv.FrameRecorder.Exception {
try {//建議在線程中使用該方法
grabber.start();
recorder.start();
Frame frame = null;
while (status&& (frame = grabber.grabFrame()) != null) {
recorder.record(frame);
}
recorder.stop();
grabber.stop();
} finally {
if (grabber != null) {
grabber.stop();
}
}
}
3、測試收流器錄制功能
inputFile設置為服務器播放地址,outputFile設置為本地地址,這里演示.mp4,也可以是flv等其他后綴名
public static void main(String[] args)
throws FrameRecorder.Exception, FrameGrabber.Exception, InterruptedException {
String inputFile = "rtsp://admin:admin@192.168.2.236:37779/cam/realmonitor?channel=1&subtype=0";
// Decodes-encodes
String outputFile = "recorde.mp4";
frameRecord(inputFile, outputFile,1);
}
到這里我們已經實現了直播功能的全部基本操作:推流,錄制,簡單的直播系統和多人視頻等已經可以實現了;
突然發現,額。。。我們的直播系統貌似沒有聲音!!!好吧,確實是這樣,直播聽不到聲音確實有點low
那么聲音要怎么獲取呢?看這里實現:http://blog.csdn.net/eguid_1/article/details/52702385
聲音會獲取了,那么接下來讓我們實現一下本地音視頻混合推流到服務器吧:
javaCV開發詳解之6:本地音頻(話筒設備)和視頻(攝像頭)抓取、混合並推送(錄制)到服務器(本地)
但是我們的系統遠不止那么簡單,比如監控和專業的攝像頭,需要通過rtsp或者碼流的形式才能獲取視頻流,這時我們需要一個轉流器,幫助我們把他們轉發到流媒體服務器,實現實時監控/視頻查看
