1. 程式人生 > >最簡單的基於librtmp的示例:釋出H.264(H.264通過RTMP釋出)

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

=====================================================

最簡單的基於libRTMP的示例系列文章列表:

=====================================================


本文記錄一個基於libRTMP的釋出H.264碼流的程式。該程式可以將H.264資料釋出到RTMP流媒體伺服器。目前這個例子還不是很穩定,下一步還有待修改。

本程式使用回撥函式作為輸入,通過自定義的回撥函式,可以傳送本地的檔案或者記憶體中的資料。


函式呼叫結構圖

本程式的函式呼叫結構圖如下所示。

 整個程式包含3個介面函式:
RTMP264_Connect():建立RTMP連線。
RTMP264_Send():傳送資料。
RTMP264_Close():關閉RTMP連線。
按照順序呼叫上述3個介面函式就可以完成H.264碼流的傳送。

結構圖中關鍵函式的作用如下所列。

RTMP264_Connect()中包含以下函式:
InitSockets():初始化Socket
RTMP_Alloc():為結構體“RTMP”分配記憶體。
RTMP_Init():初始化結構體“RTMP”中的成員變數。
RTMP_SetupURL():設定輸入的RTMP連線的URL。
RTMP_EnableWrite():釋出流的時候必須要使用。如果不使用則代表接收流。
RTMP_Connect():建立RTMP連線,建立一個RTMP協議規範中的NetConnection。
RTMP_ConnectStream():建立一個RTMP協議規範中的NetStream。

RTMP264_Send()中包含以下函式:
ReadFirstNaluFromBuf():從記憶體中讀取出第一個NAL單元。
ReadOneNaluFromBuf():從記憶體中讀取出一個NAL單元。
h264_decode_sps():解碼SPS,獲取視訊的寬,高,幀率資訊。
SendH264Packet():傳送一個NAL單元。

SendH264Packet()中包含以下函式:
SendVideoSpsPps():如果是關鍵幀,則在傳送該幀之前先發送SPS和PPS。
SendPacket():組裝一個RTMPPacket,呼叫RTMP_SendPacket()傳送出去。
RTMP_SendPacket():傳送一個RTMP資料RTMPPacket。

RTMP264_Close()中包含以下函式:
RTMP_Close():關閉RTMP連線。
RTMP_Free():釋放結構體“RTMP”。
CleanupSockets():關閉Socket。

原始碼

程式提供的3個介面函式的使用方法如下。可以看出介面比較簡單。

/**
 * Simplest Librtmp Send 264
 *
 * 雷霄驊,張暉
 * [email protected]
 * [email protected]
 * 中國傳媒大學/數字電視技術
 * Communication University of China / Digital TV Technology
 * http://blog.csdn.net/leixiaohua1020
 *
 * 本程式用於將記憶體中的H.264資料推送至RTMP流媒體伺服器。
 * This program can send local h264 stream to net server as rtmp live stream.
 */

#include <stdio.h>
#include "librtmp_send264.h"



FILE *fp_send1;

//讀檔案的回撥函式
//we use this callback function to read data from buffer
int read_buffer1(unsigned char *buf, int buf_size ){
	if(!feof(fp_send1)){
		int true_size=fread(buf,1,buf_size,fp_send1);
		return true_size;
	}else{
		return -1;
	}
}

int main(int argc, char* argv[])
{
	fp_send1 = fopen("cuc_ieschool.h264", "rb");

	//初始化並連線到伺服器
	RTMP264_Connect("rtmp://localhost/publishlive/livestream");
	
	//傳送
	RTMP264_Send(read_buffer1);

	//斷開連線並釋放相關資源
	RTMP264_Close();

	return 0;
}

介面函式內部的程式碼比較多,不再詳細記錄。

下載

Simplest LibRTMP Example


專案主頁


CSDN下載:http://download.csdn.net/detail/leixiaohua1020/8291757

本工程包含了LibRTMP的使用示例,包含如下子工程:
simplest_librtmp_receive: 接收RTMP流媒體並在本地儲存成FLV格式的檔案。
simplest_librtmp_send_flv: 將FLV格式的視音訊檔案使用RTMP推送至RTMP流媒體伺服器。
simplest_librtmp_send264: 將記憶體中的H.264資料推送至RTMP流媒體伺服器。


相關推薦

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

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

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

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

簡單基於librtmp示例 釋出H 264 H 264通過RTMP釋出

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

簡單基於librtmp示例釋出FLV通過RTMP釋出

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

簡單基於Flash的流媒體示例網頁播放器HTTP,RTMP,HLS

                =====================================================Flash流媒體文章列表:=====================================================本文繼續上一篇文章,記錄一些基於Flas

用Python實現簡單的文字識別基於百度雲文字識別API

Python版本:3.6.5 百度雲提供的文字識別技術,準確率還是非常高的,而且每天還有5w次免費的呼叫量,對於用來學習或者偶爾拿來用用,已經完全足夠了。文章提供一個模板,稍加修改就可以直接套用。註釋中提到必須輸入的地方,你都正確地輸入了的話,就可以完成一次簡單的文字識別了

簡單的vue入門基礎語法學習

新建index.html,直接複製以下程式碼,雙擊瀏覽器執行即可。程式碼包含Vue的基礎語法,可對照練習。 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8">

Web框架-龍捲風Tornado之世界上簡單的Tornado示例

原始碼 # _*_coding:utf-8_*_ import tornado.ioloop import tornado.web class MainHandler(tornado.web.R

簡單的redis教程centos6.5下redis單機版安裝《一》

安裝 命令如下: wget http://download.redis.io/releases/redis-3.0.0.tar.gz tar -zxvf redis-3.0.0.tar.gz cd

Skinned Mesh原理解析和一個簡單的實現示例

Skinned Mesh原理解析和一個最簡單的實現示例2018年1月:本文以及demo程式已儲存到github上 :作者:n52008-10月Histroy:Version:1.02 Date:2010

Extjs表單元素實現橫向、多列布局,簡單的程式碼示例

Ext.onReady(function(){ Ext.create('Ext.form.Panel',{ title : '橫向佈局測試', height : 130, width

兩臺電腦簡單的連線方法直連

今日我所在的部門電腦升級,由於安全級別較高,所有的裝置輸出埠都被封了,老電腦裡的東西如何匯入新電腦成了一個問題!上傳到公用的檔案伺服器吧,一是如果大家都把自己常年的資料上傳的話估計檔案伺服器的容量會是個問題;另外就是先上傳到檔案伺服器再下載到新電腦這時間可不會很短......

Skinned Mesh 原理解析和一個簡單的實現示例

Mesh space 是建模時使用的空間, mesh 中頂點的位置相對於這個空間的原點定義。比如在 3d max 中建模時(視 xy 平面為地面, +z 朝上),可將模型兩腳之間的中點作為 Mesh 空間的原點,並將其放置在世界原點,這樣左腳上某一頂點座標是( 10 , 10 , 2

超方便、簡單版本java 郵件傳送 半分鐘寫完程式碼

1. jar 和 郵箱設定 <!--郵件--> <dependency> <groupId>org.simplejavamail</groupId>

簡單的SpringBoot示例之.yml配置檔案

1.上一次我們已經使用SpringBoot實現了一個簡單的HelloWord程式,辣麼接下來我們簡單的使用一下他的yml格式的配置檔案。 2.在 resources 目錄下建立一個 application.yml檔案(如下),配置資訊包括伺服器資訊和一個我們自定

Skinned Mesh原理解析和一個簡單的實現示例 .

作者:n5 2008-10 月 Histroy: Version:1.02 Date:2010-1-1        修改了一些錯誤(用刪除線標出 ),補充了一些材料,        ps:本文以後只維護CSDN blog上的版本,請轉載者保留原始連結:h

史上簡單的SpringCloud教程 | 第二篇: 服務消費者rest+ribbon(Finchley版本)

在上一篇文章,講了服務的註冊和發現。在微服務架構中,業務都會被拆分成一個獨立的服務,服務與服務的通訊是基於http restful的。Spring cloud有兩種服務呼叫方式,一種是ribbon+restTemplate,另一種是feign。在這一篇文章首先講解下基於rib

Python004-資料處理示例以某個資料欄位為基準從資料中獲取不同的欄位行數

資料來源樣式如下所示:   需求: 讀取文字,以第一列為基準參考系,每個基準僅輸出滿足需要條數的資料;不滿足,全部輸出。 比如,基準為 6236683970000018780,輸出條數要求為 5。若文字中含有  6236683970000018780 多於

介面回撥,用簡單的一個匿名內部類來講解附介面回撥高階應用場景,讓你對介面的瞭解登堂入室

介面回撥,是Java開發者必須要學的一個東西,可是他呢,書上沒有,大神部落格裡也沒有,所以導致了有部分小夥紙並不瞭解這個知識,所以這裡做一個最簡單的講解。 (先不牽扯什麼非同步回撥、同步回撥) 首先,只需要記住一點,介面回撥的含義就是把程式碼換個地方寫。 正常我們是這

史上簡單易懂的二叉樹遍歷先序,中序,後序

背景描述 二叉樹遍歷相信大家在學習資料結構的時候都學習過,有遞迴方法和非遞迴方法,遞迴方法簡單,容易理解,不在本次的討論範圍內。因此本篇文章主要是討論非遞迴的方法,也就是迭代法。這種方法網上有很多解題方法,先序,後序,中序還都不一樣,很難理解。即便當時理解了,