rtmpdump 移植記錄 與 簡單使用

第一篇博客,簡單記錄最近關於rtmp的移植於使用,參考了雷大神的文章 RTMPdump 使用說明     在此說明,感謝分享


———移植———————————————————————————————————————————————————————————

rtmpdump官網(http://rtmpdump.mplayerhq.hu/)上的打包版本都比較低,所以源碼的下載使用git clone :
git clone git://git.ffmpeg.org/rtmpdump
最新版本爲 2.4

依賴庫有 zlib 和  openssl(或者是POLARSSL  GNUTLS,這三個都是ssl協議庫目前流行的就是openssl了 ),

1、 openssl 移植
下載鏈接:
https://www.openssl.org/source/openssl-1.0.1t.tar.gz

下載解壓後先閱讀 README 和INSTALL 文檔
cat README | less
cat INSTALL | less
通過閱讀安裝說明文件INSTALL 可知本地安裝方法
注意安裝目錄可以通過修改config來修改
PREFIX="(自己的安裝目錄)"

$ ./config
$ make
$ make test
$ make install
更多的編譯選項可以通過執行
$./Configure --help
來查看

交叉編譯:
執行
$./Configure  os/compiler:arm-linux-gcc --prefix=${PWD}/TMP_OUT
$make  -j8
$make install
編譯好的就在當前目錄的TMP_OUT目錄下
2、zlib的移植
zlib

解壓後直接 ./configure 配置(不用加任何配置)然後,打開Makefile 直接修改CC  和 LDSHARED 以及 prefix  變量 再接着make

3、rtmpdump 移植
rtmp源碼包一共有兩個Makefile,分別修改他們 

修改根目錄下的Makefile 
$vi Makefile
更改
安裝目錄更換{
#prefix=/usr/local
prefix=${PWD}TMP_OUT
}
本地編譯可能需要dl庫,增加鏈接庫選項{
#LIB_OPENSSL=-lssl -lcrypto $(LIBZ)
LIB_OPENSSL=-lssl -lcrypto $(LIBZ) -ldl
}

增加
增加編譯選項,包括依賴庫的路徑{
XCFLAGS=-I/home/arm_install/lib(自己的openssl和libz庫的路徑)
}
增加鏈接選項,鏈接庫的地址{
XLDFLAGS=-L/home/arm_install/lib
}
增加交叉編譯工具鏈選項{
CROSS_COMPILE=arm-linux-
}

修改
$vi librtmp/Makefile
安裝目錄更換{
#prefix=/usr/local
prefix=${PWD}TMP_OUT
}
增加
增加編譯選項,包括依賴庫的路徑{
XCFLAGS=-I/home/arm_install/include -L/home/arm_install/lib
}

增加交叉編譯工具鏈選項{
CROSS_COMPILE=arm-linux-
}

修改完後直接 make   ; make install

———簡單使用———————————————————————————————————————————————————————

my_rtmpTest.c

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<netdb.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#include "librtmp/rtmp.h"
#include "librtmp/log.h"

int printfAVal(const AVal al)
{
	int i = 0;
	for(i = 0;i <al.av_len;i++)
		printf("%c",al.av_val[i]);
	printf("\n");
}

const char RTMPProtocolStringsLower_1[][7] = {
  "rtmp",
  "rtmpt",
  "rtmpe",
  "rtmpte",
  "rtmps",
  "rtmpts",
  "",
  "",
  "rtmfp"
};

#define DEF_TIMEOUT	30	/* seconds */


int main(int argc,char * argv[])
{
	int Ret = -1;
	RTMP my_rtmp;
	AVal Host, App, Playpath;
	unsigned int Port = 0;
	int Protocol = RTMP_PROTOCOL_UNDEFINED;
	
	AVal sockshost = { 0, 0 };
	AVal tcUrl = { 0, 0 };
	AVal swfUrl = { 0, 0 };
	AVal pageUrl = { 0, 0 };
	AVal auth = { 0, 0 };
	AVal swfSHA256Hash = { 0, 0 };
	AVal flashVer = { 0, 0 };
	AVal subscribepath = { 0, 0 };
	AVal usherToken = { 0, 0 };
	uint32_t swfSize = 0;
	uint32_t dSeek = 0; 	  // seek position in resume mode, 0 otherwise
	int bLiveStream = FALSE;  // is it a live stream? then we can't seek/resume
	uint32_t dStopOffset = 0;
	long int timeout = DEF_TIMEOUT;   // timeout connection after 120 seconds

	
	int fd = 0;

	char *input_rtmp_url = NULL;
	char RTMP_RUL[] = "rtmp://live.hkstv.hk.lxdns.com/live/hks";
	if(argv[1]==NULL){
		input_rtmp_url = RTMP_RUL;
	}else{
		input_rtmp_url = argv[1];
	}
		
	printf("run %s\n",(char*)argv[0]);
	printf("input_rtmp_url == %s\n",input_rtmp_url);



	RTMP_Init(&my_rtmp);

	//InitSockets();
	
	Ret = RTMP_ParseURL(input_rtmp_url, &Protocol, &Host, &Port,
		&Playpath, &App);
	if(Ret == TRUE){
		printfAVal(Host);
		printfAVal(App);
		printfAVal(Playpath);
		printf("%d\n",Port);
	}else{
		printf("url(%s) con`t parsed!\n",input_rtmp_url);\
		goto EXIT;
	}
	
	if (Port == 0)
	  {
		if (Protocol & RTMP_FEATURE_SSL)
	  Port = 443;
		else if (Protocol & RTMP_FEATURE_HTTP)
	  Port = 80;
		else
	  Port = 1935;
	  }

	if (tcUrl.av_len == 0)
	  {
		tcUrl.av_len = strlen(RTMPProtocolStringsLower_1[Protocol]) +
		  Host.av_len + App.av_len + sizeof("://:65535/");
		tcUrl.av_val = (char *) malloc(tcUrl.av_len);
		if (!tcUrl.av_val)
		  return -1;
		tcUrl.av_len = snprintf(tcUrl.av_val, tcUrl.av_len, "%s://%.*s:%d/%.*s",
			 RTMPProtocolStringsLower_1[Protocol], Host.av_len,
			 Host.av_val,Port, App.av_len, App.av_val);
	  }
	
	RTMP_SetupStream(&my_rtmp,
			 Protocol,
			 &Host,
			 Port,
			 &sockshost,
			 &Playpath,
			 &tcUrl,
			 &swfUrl,
			 &pageUrl,
			 &App,
			 &auth,
			 &swfSHA256Hash,
			 swfSize,
			 &flashVer,
			 &subscribepath,
			 &usherToken,
			 dSeek,
			 dStopOffset,bLiveStream, timeout);

	RTMP_Connect(&my_rtmp,NULL);

	RTMP_ConnectStream(&my_rtmp,dSeek);


	fd = open("test.flv",O_CREAT|O_RDWR);
	
	if(fd){
		char buf[1024*1024] = {0};
		while(1){
			memset(buf,0,1024*1024);
			Ret = RTMP_Read(&my_rtmp,buf,1024*1024);
			printf("read size %d\n",Ret);
			if(Ret <= 0)
				break;
			else{
				write(fd,buf,Ret);
			}
		}
	}
EXIT:
	if(fd)
		close(fd);
	RTMP_Close(&my_rtmp);
	return 0;
}


編譯方法

arm-linux-gcc my_rtmpTest.c -g -static -I.//home/arm_install//include -L./home/arm_install/lib -lrtmp -lssl -lcrypto -lz -ldl  -o my_rtmp



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章