1. 程式人生 > >linux系統RTMPdump(libRTMP) 通過RTMP 釋出H264資料

linux系統RTMPdump(libRTMP) 通過RTMP 釋出H264資料

    關於RTMPdump的使用介紹,很多的都是在Windows平臺的應用,雷神有做一個系列的分析,但是雷神的也主要是以Windows平臺為主。本文主要的工作是將雷神《最簡單的基於librtmp的示例:釋出H.264(H.264通過RTMP釋出)》中的工程移植到linux系統,同時修復一些問題並且新增一部分說明。

在使用該工程之前,應該有搭建好一個RTMP伺服器,同時對H264資料格式有一個較好的瞭解。可以參考:

整個軟體的流程圖如下:


    仔細分析RTMP264_Send 函式

/**
 * 將記憶體中的一段H.264編碼的視訊資料利用RTMP協議傳送到伺服器
 *
 * @param read_buffer 回撥函式,當資料不足的時候,系統會自動呼叫該函式獲取輸入資料。
 *					2個引數功能:
 *					uint8_t *buf:外部資料送至該地址
 *					int buf_size:外部資料大小
 *					返回值:成功讀取的記憶體大小
 * @成功則返回1 , 失敗則返回0
 */ 
int RTMP264_Send(int (*read_buffer)(unsigned char *buf, int buf_size))  
{    
	int ret;
	uint32_t now,last_update;
	  
	memset(&metaData,0,sizeof(RTMPMetadata));
	memset(m_pFileBuf,0,BUFFER_SIZE);
	if((ret=read_buffer(m_pFileBuf,m_nFileBufSize))<0)
	{
		return FALSE;
	}

	NaluUnit naluUnit;  
	// 讀取SPS幀   
	ReadFirstNaluFromBuf(naluUnit,read_buffer);  
	metaData.nSpsLen = naluUnit.size;  
	metaData.Sps=NULL;
	metaData.Sps=(unsigned char*)malloc(naluUnit.size);
	memcpy(metaData.Sps,naluUnit.data,naluUnit.size);

	// 讀取PPS幀   
	ReadOneNaluFromBuf(naluUnit,read_buffer);  
	metaData.nPpsLen = naluUnit.size; 
	metaData.Pps=NULL;
	metaData.Pps=(unsigned char*)malloc(naluUnit.size);
	memcpy(metaData.Pps,naluUnit.data,naluUnit.size);
	
	// 解碼SPS,獲取視訊影象寬、高資訊   
	int width = 0,height = 0, fps=0;  
	h264_decode_sps(metaData.Sps,metaData.nSpsLen,width,height,fps);  
	//metaData.nWidth = width;  
	//metaData.nHeight = height;  
	if(fps)
		metaData.nFrameRate = fps; 
	else
		metaData.nFrameRate = 25;

	//傳送PPS,SPS
	//ret=SendVideoSpsPps(metaData.Pps,metaData.nPpsLen,metaData.Sps,metaData.nSpsLen);
	//if(ret!=1)
	//	return FALSE;

	unsigned int tick = 0;  
	unsigned int tick_gap = 1000/metaData.nFrameRate; 
	//printf(" nFrameRate = %d \n ",metaData.nFrameRate);
	ReadOneNaluFromBuf(naluUnit,read_buffer);
	int bKeyframe  = (naluUnit.type == 0x05) ? TRUE : FALSE;
	while(SendH264Packet(naluUnit.data,naluUnit.size,bKeyframe,tick))  
	{    
got_sps_pps:
		//if(naluUnit.size==8581)
			printf("NALU size:%8d\n",naluUnit.size);
		last_update=RTMP_GetTime();
		if(!ReadOneNaluFromBuf(naluUnit,read_buffer))
				goto end;
		if(naluUnit.type == 0x07 || naluUnit.type == 0x08)
			goto got_sps_pps;
		bKeyframe  = (naluUnit.type == 0x05) ? TRUE : FALSE;
		tick +=tick_gap;
		now=RTMP_GetTime();
		//msleep(tick_gap-now+last_update);
		//printf("now = %d, last_update = %d, now - last_update = %d \n",now,last_update,now - last_update);  
		msleep(tick_gap);
	}  
	end:
	free(metaData.Sps);
	free(metaData.Pps);
	return TRUE;  
}  
    在開始迴圈獲取資料之前,先讀取h264檔案的SPS和PPS。SPS是序列引數集,PPS是影象引數集。在SPS序列引數集中可以解析出影象的寬,高和幀率等資訊。而在h264檔案中,最開始的兩幀資料就是SPS和PPS,這個h264檔案只存在一個SPS幀和一個PPS幀。在做RTMP 傳輸的時候,它需要在每次傳送H264的I幀之前,傳送SPS序列引數集幀和PPS影象引數集幀。在我們這裡的處理方式是,先提取出SPS和PPS幀,然後儲存起來,然後每次傳送I幀之前都發送一次SPS和PPS幀。SPS幀和PPS幀如下:

    工程檔案如下:
[email protected]:~/test/RTMP/rtmp_push_h264$ tree
.
├── cuc_ieschool.h264
├── include
│   ├── librtmp
│   │   ├── amf.h
│   │   ├── bytes.h
│   │   ├── dhgroups.h
│   │   ├── dh.h
│   │   ├── handshake.h
│   │   ├── http.h
│   │   ├── log.h
│   │   ├── rtmp.h
│   │   └── rtmp_sys.h
│   ├── librtmp_send264.h
│   └── sps_decode.h
├── lib
│   ├── librtmp.a
│   ├── librtmp.so
│   └── librtmp.so.0
├── librtmp_send264.cpp
├── Makefile
├── simplest_librtmp_send264.cpp
└── src

相關推薦

linux系統RTMPdumplibRTMP 通過RTMP 釋出H264資料

    關於RTMPdump的使用介紹,很多的都是在Windows平臺的應用,雷神有做一個系列的分析,但是雷神的也主要是以Windows平臺為主。本文主要的工作是將雷神《最簡單的基於librtmp的示例:釋出H.264(H.264通過RTMP釋出)》中的工程移植到linux系

最簡單的基於librtmp的示例:釋出H.264H.264通過RTMP釋出

=====================================================最簡單的基於libRTMP的示例系列文章列表:=====================================================本文記錄一個基於l

最簡單的基於librtmp的示例:釋出H.264H.264通過RTMP釋出——雷神經典

===================================================== 最簡單的基於libRTMP的示例系列文章列表: ===================================================== 本文記錄一個基於libRTMP

Linux系統管理

linux redhat 服務器 系統管理 點擊下載:Linux系統管理(一)本文出自 “飛奔的魚兒” 博客,請務必保留此出處http://feiyuer.blog.51cto.com/6967044/1931977Linux系統管理(一)

Linux系統管理網絡服務

網絡服務 linux redhat 紅帽 點擊下載:Linux系統管理(二)(網絡服務)本文出自 “飛奔的魚兒” 博客,請務必保留此出處http://feiyuer.blog.51cto.com/6967044/1931978Linux系統管理(二)(網絡服務)

Linux系統管理Linux系統安裝與修復

linux系統安裝與修復一. Linux多種安裝方式與應用軟件安裝1. Linux的硬盤安裝方式(1) 復制Linux的ISO文件到硬盤某個分區(2) 用Linux安裝啟動盤啟動/DOS啟動盤啟動計算機註: DOS啟動盤中必須要存放加載Linux系統的工具及Linux內核和initrd映像文件,主要文件包括:

Linux系統管理Linux設備和內核管理

linux設備和內核管理一. 設備管理概述1.Linux設備的分類字符設備(c):以字符為單位,傳輸速率較低,無需緩沖區。塊設備(b):以數據塊為單位組織和傳輸數據,需要建立緩沖區網絡設備(s):一種通過SOCKET接口進行主機通信的設備2.設備文件(1)功能用於用戶訪問設備進行輸入和輸出操作(2)常見的設

Linux學習並不難》獲取Linux系統幫助2:使用man手冊頁

man 手冊 幫助 4.2 《Linux學習並不難》獲取Linux系統幫助(2):使用man手冊頁安裝好Linux系統後,首先要做的是學會如何在Linux系統下獲取幫助,man手冊頁是一種不錯的方法,man是一種顯示Unix/Linux在線手冊的命令。可以用來查看命令、函數或者是文件的幫助手冊,

一次性講明白Linux系統呼叫1

什麼是系統呼叫 Linux核心中設定了很多可以實現各種系統功能的子程式,這些子程式就叫系統呼叫。而系統呼叫和普通函式呼叫的區別主要是在系統呼叫是系統提供的,函式一般是函式庫或者自己提供的。 為什麼要用系統呼叫 其實很多我們平時用的C語言標準函式,在Linux

Linux系統介紹

第一部分:     1:linux基礎簡介         1:作業系統(Operating System)          &nb

Linux系統介紹

一.linux 作業系統概述     1.常見作業系統        - 服務端作業系統 : linux、unix、windows server         - 單機作業系統 :

linux系統管理1之 核心編譯選項檢視

三個方法 proc檔案系統 ubunut debain 紅帽等 proc檔案系統 /proc/config.gz This file shows you the compile-time configuration settings for the kernel (gzip compr

標號4:python(就業階段)——Linux系統命令3——《vim編輯器》

三、編輯器vim >vim是一個功能強大、高度可定製的文字編輯器 <1>vim有三種基本工作模式: 1、命令模式 |命令|功能| |:----|:-----| |移動游標:|h: 左移 j: 下移 k: 上移 l: 右移| |M|游標移動到中間行 | |G

標號3:python(就業階段)——Linux系統命令2——《遠端登入和遠端拷貝》

二、遠端登入和遠端拷貝 <1>ssh介紹 >(1)SSH(Secure Shell)是專為遠端登入會話和其他網路服務提供安全性的協議。常用於遠端登入,以及使用者之間進行資料拷貝。 (2)SSH 為建立在應用層和傳輸層基礎上的安全協議。 (3)利用SSH協議可以有效防止遠端管

標號2:python(就業階段)——Linux系統命令1——《高階Linux命令及命令選項的使用》

一、高階Linux命令及命令選項的使用 <1>重定向命令:> Linux允許將命令執行結果重定向到一個檔案,本應顯示在終端上的內容儲存到指定檔案中。 1、ls >> test.txt 輸出重定向則會追加到檔案的尾部。 2、ls > test.t

python(就業階段)——Linux系統命令2——《遠端登入和遠端拷貝》

二、遠端登入和遠端拷貝 <1>ssh介紹 (1)SSH(Secure Shell)是專為遠端登入會話和其他網路服務提供安全性的協議。常用於遠端登入,以及使用者之間進行資料拷貝。 (2)SSH 為建立在應用層和傳輸層基礎

linux系統程式設計--時間與錯誤處理

#inlcude<error.h> errno perror(); //列印錯誤 strerror //列印錯誤 #inlcude<time.h> //使用CLOCKS_PER_SEC //常量可以得到秒數 clock_t \\ typedef

linux系統程式設計--檔案操作

1.0    檔案描述符         每個程序啟動後會自動開啟三個檔案描述符 0、1、2             分別對應於巨集 STDIN_FIL

Linux系統LVM部署-擴容-縮容-快照-刪除

常用LVM命令總結: 注: 以下案例均採用的系統版本是Oracle linux 7.3 LVM案例: 部署案例: 第 1 步:讓新新增的兩塊硬碟裝置支援LVM 技術。 [[email protected] ~]# pvcreate /dev/sdb /dev/sdc Physical vo

linux系統Centos安裝Elasticsearch詳細教程

1.Elasticsearch簡介 ElasticSearch是一個基於Lucene的搜尋伺服器。什麼是Lucene? 就是一個jar包,裡面包含了封裝好的各種倒排索引,以及進行搜尋的程式碼,包括各種演算法。我們就用java開發的時候,引入lucene jar,