javaCV開發詳解之3:收流器實現,錄製流媒體服務器的rtsp/rtmp視頻文件(基於javaCV-FFMPEG)

javaCV系列文章:java

javacv開發詳解之1:調用本機攝像頭視頻windows

javaCV開發詳解之2:推流器實現,推本地攝像頭視頻到流媒體服務器以及攝像頭錄製視頻功能實現(基於javaCV-FFMPEG、javaCV-openCV)服務器

javaCV開發詳解之3:收流器實現,錄製流媒體服務器的rtsp/rtmp視頻文件(基於javaCV-FFMPEG)網絡

javaCV開發詳解之4:轉流器實現(也可做爲本地收流器、推流器,新增添加圖片及文字水印,視頻圖像幀保存),實現rtsp/rtmp/本地文件轉發到rtmp流媒體服務器(基於javaCV-FFMPEG)測試

javaCV開發詳解之5:錄製音頻(錄製麥克風)到本地文件/流媒體服務器(基於javax.sound、javaCV-FFMPEG)ui

javaCV開發詳解之6:本地音頻(話筒設備)和視頻(攝像頭)抓取、混合並推送(錄製)到服務器(本地)編碼

javaCV開發詳解之7:讓音頻轉換更加簡單,實現通用音頻編碼格式轉換、重採樣等音頻參數的轉換功能(以pcm16le編碼的wav轉mp3爲例)spa

補充篇:
.net

音視頻編解碼問題:javaCV如何快速進行音頻預處理和解複用編解碼(基於javaCV-FFMPEG)線程

音視頻編解碼問題:16/24/32位位音頻byte[]轉換爲小端序short[],int[],以byte[]轉short[]爲例

實現給圖片增長圖片水印或者文字水印(也支持視頻圖像幀添加水印)

    歡迎你們積極開心的加入討論羣

前言:
上一章中實現了本地推流器和本地攝像頭錄製功能:http://blog.csdn.net/eguid_1/article/details/52678775
本章基於javaCV實現收流器功能和錄製功能
補充:基於本功能能夠實現遠程流媒體服務器實時視頻錄製到本地

1、開發所依賴的包(與上一章相同,具體依賴包請查看上一章)

本章使用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;

2、代碼實現

本功能採用按幀實現收流器錄製功能

/**
	 * 按幀錄製視頻
	 * 
	 * @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 start=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();
			}
		}
	}

三、測試收流器錄製功能

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
聲音會獲取了,那麼接下來讓咱們實現一下本地音視頻混合推流到服務器吧:
可是咱們的系統遠不止那麼簡單,好比監控和專業的攝像頭,須要經過rtsp或者碼流的形式才能獲取視頻流,這時咱們須要一個轉流器,幫助咱們把他們轉發到流媒體服務器,實現實時監控/視頻查看
下一章將會講解轉流器實現:
相關文章
相關標籤/搜索