librtmp源碼
1. librtmp.so怎麼由32位轉換為64位
64位Win7要轉成32位的,只能格式化重新安裝32位Win7。 64位Win7安裝好之後,C盤佔用量是比32位的多一點,但不會多於5G。我的Win7 64位操作系統也是自動更新,裝了快一年了世亮才佔用30G,關鍵是你自己平時要注意,不要什麼東西都裝在C盤。還有就是調整一下系統搜昌寬還原設置,控制C盤使用。具體如下: 右鍵桌面「計算機」圖標,選擇「屬性」迅余。選擇左邊的「高級系統設置」,在彈出的「系統屬性」中選擇「系統保護」標簽頁,點擊「配置」,調整磁碟空間的「最大使用量」。
2. centos 安裝軟體過程的問題
yum安裝缺少了很多依賴,沒有源的就得現在對應缺少的包源碼編譯
3. librtmp 推流 支持 多線程 么
來自rtmpmp.c
rtmpmp 可使用命令
直播流
rtmpmp.exe -o savename.flv -r rtmp://127.0.0.1/live/testlive -v
點播流
rtmpmp.exe -o savename.flv -r rtmp://127.0.0.1/vod/test.flv
直播需要加-v參數
下面是從中提取的代碼,進行直播或點播流的錄制
伺服器使用FMS測試通過
crtmpserver需注意超時設置
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <stdio.h>
#include <signal.h>
#include <stdint.h>
#include "librtmp/rtmp_sys.h"
#include "librtmp/log.h"
#pragma comment(lib,"ws2_32.lib")
#pragma comment(lib,"librtmp.lib")
int InitSockets()
{
WORD version;
WSADATA wsaData;
version = MAKEWORD(1, 1);
return (WSAStartup(version, &wsaData) == 0);
}
void CleanupSockets()
{
WSACleanup();
}
int main()
4. 直播系統源碼是如何實現視頻直播以及直播系統搭建的
一、手機直播系統源碼開發實現視頻直播主要有以下四步:
1)前端採集編碼設備:提供直播信號源的採集和編碼壓縮功能,並將信號推送到直播流媒體伺服器上。
2)直播流媒體伺服器:負責直播流的發布和轉播分發功能。
3)WEB伺服器:實現直播節目在終端上的展現。
4)終端設備:包括PC和移動終端。編碼和協議 是實現直播的重要環節:1)網路協議:主要有3種 a. RTSP(Real Time Streaming Protocol)是用來控制聲音或影像的多媒體串流協議, 由Real Networks和Netscape共同提出的;b. RTMP(Real Time Messaging Protocol):實時消息傳送協議是Adobe公司為Flash播放器和伺服器之間音頻、視頻和數據傳輸 開發的開放協議;c. HLS(HTTP Live Streaming):是蘋果公司(Apple Inc.)實現的基於HTTP的流媒體傳輸協議; 2)視頻編碼: Mpeg4, H264等 3)音頻編碼: Mp3, AAC等4)視頻解析度: 標清通常指的是640×480(或768×480);高清指的是1280×720;全高清指的是1920×1080;超高清3840×2160。
二、直播系統源碼搭建伺服器部署重點
直播系統源碼有哪幾塊組成,視頻直播的過程一般可以分為採集、前處理、編碼、傳輸、解碼、渲染這幾個環節,經過這幾個環節之後,我們就可以通過PC端或者移動端進行視頻直播的觀看。直播系統在搭建時會用到多個業務伺服器,共同完成直播系統的業務邏輯流程。通常在伺服器部署時會採用動靜分離分布式部署方式,保障了直播平台的穩定運行。主要用到以下的業務伺服器。
1)消息伺服器:主要用於消息推送,給用戶推送房間聊天消息、私信消息。
2)業務伺服器:手機直播的業務部分、好友關系、直播管理、貨幣系統、禮物系統等。
3)視頻伺服器:視頻直播、點播、轉碼、存儲和點播等。
4)IM即時聊天:使用Node.js服務自主搭建部署聊天伺服器。
5)視頻流(流媒體伺服器):建議採用第三方CDN,開通賬號即可使用。關於CDN方面的內容,我們會在以後的內容中做重點介紹。
6)業務伺服器:網站邏輯基於php-tlinkphp、thinkcmf、mysql、redis。MYSQL 服務提供靜態數據的存儲,REDIS 服務提供數據的緩存、存儲動態數據。
以上便是對直播系統源碼如何實現視頻直播以及搭建伺服器的簡單介紹。搭建直播開發平台之前就是找到一款優質的直播系統源碼,直播系統源碼開發原理比其他軟體更加復雜,而且相對於技術以及其他方面都會有一定的要求。直播系統源碼的穩定性和安全性決定了後期搭建出的直播平台的流暢度、高並發承載及用戶的產品體驗,所以選擇直播源碼的時候一定不要為了貪圖價格便宜,而選擇安全性低,系統功能不會正常更新,bug一堆的源碼。直播系統源碼的開發需要經過推流端(採集、前處理)、服務端處理(編碼、轉碼、錄制、截圖、鑒黃)、播放器(拉流、解碼、渲染和互動系統)。望採納,謝謝
5. 如何編譯libcurl
1:linux下源碼編嘩帆譯
./改蘆逗configure --prefix=/usr/local/curl --disable-shared --enable-static --without-libidn --without-ssl --without-librtmp --without-gnutls --without-nss --without-libssh2 --without-zlib --without-winidn --disable-rtsp --disable-ldap --disable-ldaps --disable-ipv6
注意:不需要其它功能就disable,核賣不然會在連接時報錯, 如果你沒有disable掉,但你的機器上又沒有安裝相應的庫,link時會報錯。
6. 求教高手:如何在NDKr5下用單獨的靜態庫編譯
何使用ndkffmpeg編譯rtmp+polarssl靜態庫問題花我整整間其遇問題記錄便自便其 一、編譯polarssl查看其Readme文件即需要configure需要make帶必要參數即要記每執行make命令都帶CC參數(指向arm gcc)我試make install沒帶CC參數雖能編譯polarssl未能確rtmp引用 二、前面我用polarssl前新(一.三.漆)版本librtmp使用像polarssl一.0.0版本api所需要修改rtmp部源碼讓其調用新版polarsslapi修改參照《Migrating from PolarSSL-一.二 to the PolarSSL 一.三 branch》《[rtmpmp] branch master updated. a三一二ac漆 Fix compat with PolarSSL >= 一.一.0》 三、現 undefined reference to `havege_random』錯誤polarssl默認關閉havege模塊需要手啟主要修改include/polarssl/config.h掉POLARSSL_HAVEGE_C前注釋要定義POLARSSL_HAVEGE_C: #define POLARSSL_HAVEGE_C 四、編譯面兩庫始編譯ffmpeg(二.一.一版本)遇面問題 check_pkg_config librtmp librtmp/rtmp.h RTMP_Socket ERROR: librtmp not found 三種解決: 第種中國絡傳播算比較簡便修改ffmpegconfigure行: enabled librtmp && require_pkg_config librtmp librtmp/rtmp.h RTMP_Socket 改: enabled librtmp && require librtmp librtmp/rtmp.h RTMP_Socket -lrtmp -lpolarssl -lz 或者直接注釋掉&& *** 部再自加librtmp庫路徑行 第二種(比較推薦解決順帶解決部找庫錯誤)使用pkg-config工具查找庫工具ndk並沒附帶提供現check_pkg_config相關錯誤要稍加註意發現使用configure配置ffmpeg交叉編譯已經相應pkg-config存警告我工具熟悉所我簡單加軟鏈接系統pkg-config: ln -s /usr/bin/pkg-config /home/cidy0一0陸/android-ndk-r9d/toolchains/arm-linux-androideabi-四.吧/prebuilt/linux-x吧陸_陸四/bin/arm-linux-androideabi-pkg-config 候重新configure能現找polarssl庫錯誤提示需要修改librtmp安裝目錄librtmp.pc,內容: Libs: -L${libdir} -lrtmp -lz 改: Libs: -L${libdir} -lrtmp -lz -lpolarssl 至確編譯ffmpeg 轉
7. 想要搭建一款穩定的直播平台,直播源碼怎麼安裝啊
一、搭建直播平台源碼,移動直播推流端
直播推流端即主播端,主要通過手機攝像頭採集視頻數據和麥克風採集音頻數據,經過一系列前處理、編碼、封裝,然後推流到CDN進行分發。
1、採集
移動直播SDK通過手機攝像頭和麥克風直接採集音視頻數據。其中,IOS硬體種類不多,所以比較簡單,安卓則由於市面上硬體機型非常多,所以難以做到一個庫適配所有硬體。
2、前處理
在這個環節主要處理美顏、水印、模糊等效果。美顏功能幾乎是直播的標配功能。我們調研中發現太多case是因為沒有美顏功能被拋棄使用的。另外國家明確提出了,所有直播都必須打有水印並回放留存15天以上。
3、編碼
為了便於手機視頻的推流、拉流以及存儲,通常採用視頻編碼壓縮技術來減少視頻的體積,現在比較常用的視頻編碼是H.264。在音頻方面,比較常用的是AAC編碼格式,其它如MP3、WMA也是可選方案。
4、推流
要想用於推流還必須把音視頻數據使用傳輸協議進行封裝,變成流數據。常用的流傳輸協議有RTSP、RTMP、HLS等,使用RTMP傳輸的延時通常在1–3秒,對於移動直播這種實時性要求非常高的場景,RTMP也成為移動直播中最常用的流傳輸協議。最後通過一定的Qos演算法將音視頻流數據推送到網路斷,通過CDN進行分發。
二、搭建直播平台源碼,服務端處理
為了讓推上來的流適配各終端各種不同協議,服務端還需要對流進行轉碼,包括截圖、錄制、水印等。
三、搭建直播平台源碼,播放器端
1、拉流
拉流實際是推流的逆過程。首先通過播放端獲取碼流,標準的拉流格式有RTMP、HLS、FLV等。RTMP是Adobe的專利協議,開源軟體和開源庫都支持的比較好,如開源的librtmp庫,播放端只要支持flashPlayer的就能非常簡單的播放RTMP直播,直播延遲一般在1–3秒。
1、解碼和渲染
是指從音視頻的數據中提取原始數據,也即音視頻的播放。前面介紹的H.264和H.265編碼格式都是有損壓縮,所以在提取後的原始數據,並非原始采樣數據,存在一定的信息丟失。因此,在視頻體積最小的情況下通過各種編碼參數保留最好的原始畫面,成為了各視頻公司的核心機密。
總之,搭建一套直播系統還是很復雜的,大部分運營級的直播系統,是直接找專業的開發團隊進行項目開發、系統測試和最終的上線部署,一整套開發到上架,最後還需要有專門的技術維護團隊進行運營過程中的技術問題處理。我之前在山東布穀直播開發了一套直播程序,有售後保障,你可以咨詢問問。
8. RTMP協議抓包分析拉流過程
RTMP協議規定,播放一個流媒體有兩個前提步驟:
第一步,建立一個網路連接(NetConnection)。
第二步,建立一個網路流(NetStream)。
網路連接代表伺服器端應用程序和客戶端之間基礎的連通關系,網路流代表了發送多媒體數據的通道。伺服器和客戶端之間只能建立一個網路連接,但是基於該連接可以創建很多網路流。
播放一個RTMP協議的流媒體需要經過四個階段:
下面是使用librtmp執行拉流過程的API調用流,如下:
RTMP定義了較為完善的協議標准,但是每種播放工具的實現略有差異,下面是我使用VLC播放器拉流時抓取的報文,使用wireshark分析過程整理為下面的圖文。
先看一張總覽圖,圖中顯示的報文和時序包含了握手、建立連接、建立流和播放階段,如下:
還有申明下,以下的流程是根據實際抓包情況分析出來的,由於不同的工具省略了一些不必要的步驟,故不代表標准結果,僅供參考。
由於講解握手過程的文檔資料比較多,我這里就不重復描述了,摘圖如下:
個人認為這張圖是最符合標准時序的,細節拿捏得非常講究,雖然很多實現簡化了流程。
包括以下報文和步驟:
協議截圖如下:
協議方向:客戶端 -> 伺服器
塊頭欄位:
HeaderType: 0
CSID: 3
猛神 時間戳:0
BodySize: 201
枝坦虧 TypeID: 0x14
Stream ID: 0
負載格式:AMF0表示,connect 1 object1
object1屬性列表:
信睜 "app": "live"
"flashVer": "LNX 9,0,124,2"
"tcUrl": " rtmp://127.0.0.1:1935/live "
"fpad": false
"capabilities": 15,
"audioCodes": 4071,
"videoCodes": 252,
"videoFunction": 1,
End Of Object Marker
協議截圖如下:
協議方向:伺服器 -> 客戶端
塊頭欄位:
HeaderType: 0
CSID: 2
時間戳:0
BodySize: 4
TypeID: 0x05
Stream ID: 0
負載格式:4位元組整型表示,如5000000
協議截圖如下:
協議方向:伺服器 -> 客戶端
塊頭欄位:
HeaderType: 0
CSID: 2
時間戳:0
BodySize: 5
TypeID: 0x06
Stream ID: 0
負載格式:5位元組整型表示,前4位元組為帶寬,後1位元組為標志,如5000000, 2(動態調整)
協議截圖如下:
協議方向:伺服器 -> 客戶端
塊頭欄位:
HeaderType: 0
CSID: 2
時間戳:0
BodySize: 4
TypeID: 0x01
Stream ID: 0
負載格式:4位元組整型表示,如4096
協議截圖如下:
協議方向:伺服器 -> 客戶端
塊頭欄位:
HeaderType: 0
CSID: 3
時間戳:0
BodySize: 190
TypeID: 0x14
Stream ID: 0
負載格式:AMF0表示,_result 1 object1 object2
object1屬性列表:
"fmsVer": "FMS/3,0,1,123"
"capabilities": 31,
End Of Object Marker
object2屬性列表:
"level": "status"
"code": "NetConnection.Connect.Success",
"description": "Connection succeeded.",
"objectEncoding": 0
End Of Object Marker
協議截圖如下:
協議方向:客戶端 -> 伺服器
塊頭欄位:
HeaderType: 0
CSID: 2
時間戳:0
BodySize: 4
TypeID: 0x05
Stream ID: 0
負載格式:4位元組整型表示,如5000000
包括以下報文和步驟:
協議截圖如下:
協議方向:客戶端 -> 伺服器
塊頭欄位:
HeaderType: 1
CSID: 3
時間戳:0
BodySize: 25
TypeID: 0x14
負載格式:AMF0表示,createStream 2 object(Null)
協議截圖如下:
協議方向:伺服器 -> 客戶端
塊頭欄位:
HeaderType: 0
CSID: 3
時間戳:0
BodySize: 29
TypeID: 0x14
Stream ID: 0
負載格式:AMF0表示,_result 2 object(Null) Number(1)
包括以下報文和步驟:
協議截圖如下:
協議方向:客戶端 -> 伺服器
塊頭欄位:
HeaderType: 0
CSID: 8
時間戳:0
BodySize: 30
TypeID: 0x14
Stream ID: 1
負載格式:AMF0表示,play 4 Object(Null) String節目ID("a") Number開始時間(-2000)
協議截圖如下:
協議方向:客戶端 -> 伺服器
塊頭欄位:
HeaderType: 1
CSID: 2
時間戳:1
BodySize: 10
TypeID: 0x04
負載格式:Event Type,2位元組的類型(3) 4位元組的流ID(1) 4位元組的MS時間單位(3000)
協議截圖如下:
協議方向:伺服器 -> 客戶端
塊頭欄位:
HeaderType: 0
CSID: 2
時間戳:0
BodySize: 6
TypeID: 0x04
負載格式:Event Type,2位元組的類型(0) 4位元組的流ID(1)
協議截圖如下:
協議方向:伺服器 -> 客戶端
塊頭欄位:
HeaderType: 0
CSID: 5
時間戳:0
BodySize: 96
TypeID: 0x14
Stream ID: 1
負載格式:AMF0表示,onStatus 0 Object1(Null) object2
object2屬性列表:
"level": "status"
"code": "NetStream.Play.Start",
"description": "Start live",
End Of Object Marker
協議截圖如下:
協議方向:伺服器 -> 客戶端
塊頭欄位:
HeaderType: 0
CSID: 5
時間戳:0
BodySize: 387
TypeID: 0x12
Stream ID: 1
負載格式:AMF0表示,onMetaData object
object屬性列表:
"Server": "NGINX RTMP"
"width": 480,
"height": 270,
"displayWidth": 480,
"displayHeight": 270,
"ration": 0,
"framerate": 16,
"fps": 16,
"videodatarate": 193,
"videocodeid": 7,
"audiodatarate": 52,
"audiocodeid": 10,
"profile": "",
"level": "",
End Of Object Marker
協議截圖如下:
協議方向:伺服器 -> 客戶端
塊頭欄位:
HeaderType: 0
CSID: 6
時間戳:0
BodySize: 209
TypeID: 0x08
Stream ID: 1
負載格式:格式頭,媒體數據
結合以上分析,總結時序圖如下:
另外,關於HeaderType和CSID的運用,先歸納使用情況:
0x14(connect) HeaderType: 0 CSID: 3
0x05(Ack Window Size) HeaderType: 0 CSID: 2
0x06(BrandWidth) HeaderType: 0 CSID: 2
0x01(ChunkSize) HeaderType: 0 CSID: 2
0x14(connect _result) HeaderType: 0 CSID: 3
0x14(createStream) HeaderType: 1 CSID: 3
0x14(createStream _result) HeaderType: 0 CSID: 3
0x14(play) HeaderType: 0 CSID: 8
0x04(SetBufferMS) HeaderType: 1 CSID: 2
0x04(Stream Begin) HeaderType: 0 CSID: 2
0x14(play onStatus) HeaderType: 0 CSID: 5
0x12(onMetaData) HeaderType: 0 CSID: 5
0x08(audioData) HeaderType: 0 CSID: 6
0x09(videoData) HeaderType: 0 CSID: 7
總結:
關於HeaderType的運用,有以下規則:
createStream使用1號HeaderType,借用3號CSID之前的StreamID。
SetBufferMS使用1號HeaderType。
audioData和videoData視情況使用0、1、2、3號HeaderType。
關於CSID的運用,有以下規則:
9. 如何使用ndk為ffmpeg編譯rtmp+polarssl靜態庫
如何使用ndk為ffmpeg編譯rtmp+polarssl靜態庫?這個問題花了我整整一天時間。其中遇到很多小問題,這里記錄一下,方便自己也方便其他人。
1、編譯polarssl,查看其Readme文件即可,不需要configure,只需要make時帶上必要的參數即可,不過要記得在每一次執行make命令時都帶上CC的參數(指向你的arm gcc),因為我試過在make install時沒有帶上CC的參數,雖然能編譯出polarssl但是未能正確被rtmp引用到。
2、因為前面我用的polarssl是當前最新(1.3.7)版本,而librtmp使用的好像是polarssl1.0.0以下版本的api,所以需要修改rtmp部分源碼,讓其調用新版polarssl的api,這里的修改可以參照《Migrating from PolarSSL-1.2 to the PolarSSL 1.3 branch》和《[rtmpmp] branch master updated. a312ac7 Fix compat with PolarSSL >= 1.1.0》。
3、出現 undefined reference to `havege_random』錯誤,這里是因為polarssl默認關閉了havege模塊,需要你手動開啟,主要就是修改include/polarssl/config.h,去掉POLARSSL_HAVEGE_C前的注汪槐釋,也就是要定義POLARSSL_HAVEGE_C,如下:
#define POLARSSL_HAVEGE_C
4、在編譯出上面兩個庫之後,可以開始編譯ffmpeg(2.1.1版本)了,如果遇到下面的問題 check_pkg_config librtmp librtmp/rtmp.h RTMP_Socket
ERROR: librtmp not found
這里有三種解決方法:
第一種,因為是網路上傳播最多的,算猛陵升是比較簡便的方法,就是修改ffmpeg的configure,將以下一行:
enabled librtmp && require_pkg_config librtmp librtmp/rtmp.h RTMP_Socket
改為:
enabled librtmp && require librtmp librtmp/rtmp.h RTMP_Socket -lrtmp -lpolarssl -lz
或者直接注釋掉&& *** 部分,然後再自己加上librtmp的庫路徑也行
第二種,(比較推薦,因為解決了這個會順帶解決大部分找不到庫的錯誤!)因為這里使用了pkg-config工具查找庫,而這個工具ndk並沒有附帶提供,而出現check_pkg_config相關錯誤的話,只要稍加註枝老意,會發現在使用configure配置ffmpeg的交叉編譯時,已經有相應的pkg-config不存在的警告了。我對這個工具不熟悉,所以我只是簡單地加上了一個軟鏈接到系統的pkg-config,如下:
ln -s /usr/bin/pkg-config /home/cidy0106/android-ndk-r9d/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-pkg-config
這個時候重新configure的話可能會出現找不到polarssl庫的錯誤提示,需要修改一下librtmp安裝目錄里的librtmp.pc,把以下內容:
Libs: -L${libdir} -lrtmp -lz
改為:
Libs: -L${libdir} -lrtmp -lz -lpolarssl
至此,就可以正確編譯出ffmpeg了