linux系統RTMPdump(libRTMP) 通過RTMP 釋出H264資料
關於RTMPdump的使用介紹,很多的都是在Windows平臺的應用,雷神有做一個系列的分析,但是雷神的也主要是以Windows平臺為主。本文主要的工作是將雷神《最簡單的基於librtmp的示例:釋出H.264(H.264通過RTMP釋出)》中的工程移植到linux系統,同時修復一些問題並且新增一部分說明。
在使用該工程之前,應該有搭建好一個RTMP伺服器,同時對H264資料格式有一個較好的瞭解。可以參考:
整個軟體的流程圖如下:
仔細分析RTMP264_Send 函式
在開始迴圈獲取資料之前,先讀取h264檔案的SPS和PPS。SPS是序列引數集,PPS是影象引數集。在SPS序列引數集中可以解析出影象的寬,高和幀率等資訊。而在h264檔案中,最開始的兩幀資料就是SPS和PPS,這個h264檔案只存在一個SPS幀和一個PPS幀。在做RTMP 傳輸的時候,它需要在每次傳送H264的I幀之前,傳送SPS序列引數集幀和PPS影象引數集幀。在我們這裡的處理方式是,先提取出SPS和PPS幀,然後儲存起來,然後每次傳送I幀之前都發送一次SPS和PPS幀。SPS幀和PPS幀如下: 工程檔案如下:/** * 將記憶體中的一段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; }
[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系統RTMPdump(libRTMP) 通過RTMP 釋出H264資料
關於RTMPdump的使用介紹,很多的都是在Windows平臺的應用,雷神有做一個系列的分析,但是雷神的也主要是以Windows平臺為主。本文主要的工作是將雷神《最簡單的基於librtmp的示例:釋出H.264(H.264通過RTMP釋出)》中的工程移植到linux系
最簡單的基於librtmp的示例:釋出H.264(H.264通過RTMP釋出)
=====================================================最簡單的基於libRTMP的示例系列文章列表:=====================================================本文記錄一個基於l
最簡單的基於librtmp的示例:釋出H.264(H.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,