RTMP協議發送H.264編碼及AAC編碼的音視頻,實現攝像頭直播

RTMP協議發送H.264編碼及AAC編碼的音視頻,實現攝像頭直播
摘要: RTMP協議發送H.264編碼及AAC編碼的音視頻,實現攝像頭直播  RTMP(Real Time Messaging Protocol)是專門用來傳輸音視頻數據的流媒體協議,最初由Macromedia 公司創建,后來歸Adobe公司所有,是一種私有協議,主要 ...

RTMP協議發送H.264編碼及AAC編碼的音視頻,實現攝像頭直播

  RTMP(Real Time Messaging Protocol)是專門用來傳輸音視頻數據的流媒體協議,最初由Macromedia 公司創建,后來歸Adobe公司所有,是一種私有協議,主要用來聯系Flash Player和RtmpServer,如FMS,?Red5,?crtmpserver等。RTMP協議可用于實現直播、點播應用,通過FMLE(Flash Media Live Encoder)推送音視頻數據至RtmpServer,可實現攝像頭實時直播。不過,畢竟FMLE應用范圍有限,想要把它嵌入到自己的程序中,還是要自己來實現RTMP協議的推送。本人實現了一個RTMPLiveEncoder,通過采集攝像頭視頻和麥克風音頻,并進行H.264和AAC編碼,然后發送到FMS和crtmpserver上,實現實時直播,可以通過flash player正常觀看,目前效果良好,延遲時間在2秒左右。本文就介紹一下RTMPLiveEncoder的主要思路和關鍵點,以期對需要這方面技術的朋友有所幫助。

技術分析

  要實現RTMPLiveEncoder,需要以下四種關鍵技術:

  • 采集攝像頭視頻和麥克風音頻
  • H264編碼和AAC編碼
  • 視頻和音頻數據封裝為可被流媒體服務器識別的可播放流
  • RTMP協議實現報文發送

  其中,前兩項技術在我之前的文章“采集音頻和攝像頭視頻并實時H264編碼和AAC編碼”中已經介紹過了,這里就不再啰嗦了。

  把音視頻數據封裝為可播放流,這個是一個難點。仔細研究一下,你會發現,RTMP Packet中封裝的音視頻數據流,其實和FLV封裝音頻和視頻數據的方式是相同的,所以,我們只需要按照FLV封裝H264和AAC的方式,即可生成可播放流。

  我們再看一下RTMP協議。Adobe曾經發布過一份文檔《RTMP Specification》,不過wikipedia指出這份文檔隱藏了很多細節,單獨根據它是無法正確實現RTMP的。不過,它還是有參考意義的。其實Adobe發布之前,RTMP協議就已經被破解的差不多了,現在也已經有比較完善的實現,比如:RTMPDump,它提供的是C語言的接口,這意味著可以很方便的在其他語言中調用。

程序框架

  與我之前寫的“采集音頻和攝像頭視頻并實時H264編碼和AAC編碼”這篇文章相同,采用DirectShow技術來實現音視頻采集,音頻編碼和視頻編碼,在各自線程(AudioEncoderThread和VideoEncoderThread)中循環進行,RTMP的推送另起一個線程(RtmpThread)。兩個編碼線程實時編碼音視頻數據后,將數據交與Rtmp線程,由Rtmp線程循環封裝為Rtmp Packet,然后發出去。

  線程之間的數據交換,通過一個隊列DataBufferQueue來實現。AudioEncoderThread和VideoEncoderThread把數據指針post到DataBufferQueue之后,立即返回,這樣就可以避免因為發送Rtmp報文的而影響到編碼線程的正常執行時間。

? ??

  RtmpThread的主要工作就是發送音頻數據流的解碼信息頭和視頻數據流的解碼信息頭,并不斷從DataBufferQueue中取出數據,封裝為RTMP Packet,發送出去。流程如下列代碼所示:(process_buf_queue_,即是上圖中的DataBufferQueue)

librtmp

一、編譯librtmp

  下載rtmpdump的代碼,你會發現,它是一個地道的linux項目,除了一個簡單的Makefile,其他什么都沒有。好像librtmp不依賴于系統,我們可以不用費太多功夫,把它在windows上編譯。不過,librtmp依賴于openssl和zlib,我們需要首先編譯好它們。

  1. 編譯openssl1.0.0e

  a) 下載并安裝ActivePerl

  b)?下載并安裝nasm(http://nasm.sourceforge.net/)

  c)?解壓openssl壓縮包

  d)?運行cmd命令行,切到openssl目錄,分別執行以下命令

>perl Configure VC-WIN32 --prefix=c:\some\dir
>ms\do_nasm

  e)?運行Visual Studio Command Prompt(2010),切到openssl目錄,分別執行以下命令。

>nmake -f ms\nt.mak
>nmake -f ms\nt.mak install

  f)?編譯完畢后,即可在第一個命令所指定的目錄下發現編譯好的sdk。

  2. 編譯zlib

  a)?解壓zlib壓縮包

  b)?運行Visual Studio Command Prompt(2010),切到openssl目錄,分別執行以下命令

>cd contrib\masmx86
>bld_ml32.bat

  c)?回到zlib目錄,進入contrib\vstudio\vc10目錄,打開vs2010解決方案文件,

   ??在zlibstat工程屬性中,去掉預編譯宏 ZLIB_WINAPI

  d)?選擇debug或release編譯即可

  3. 編譯librtmp

  a) 首先打開visual studio 2010,新建一個win32 console工程,指定為靜態鏈接庫

  b) 將librtmp的代碼導入工程,把openssl、zlib的頭文件和librtmp放在一起,把編譯好的openssl和zlib的靜態庫放在一起

? ??? ??

  c) 在工程設置中,添加之前編譯好的openssl和zlib的庫,編譯即可。

? ??

二、librtmp的使用

  首先初始化RTMP結構

  開始之后,就要向RTMP Server發起握手連接報文

  連接成功,就可以開始循環發送報文了,這里需要指定時戳和數據類型(Audio、Video、Metadata)。這里有一點需要注意的是,在調用Send之前,buf中的數據,必須是已經封裝好的H264或AAC數據流,具體見下面的介紹。

  關閉

  最后是釋放

?

H264和AAC數據流

  本文提到過,RTMP推送的音視頻流的封裝形式和FLV格式相似,由此可知,向FMS推送H264和AAC直播流,需要首先發送"AVC sequence header"和"AAC sequence header",這兩項數據包含的是重要的編碼信息,沒有它們,解碼器將無法解碼。

  AVC sequence header就是AVCDecoderConfigurationRecord結構,該結構在標準文檔“ISO-14496-15 AVC file format”中有詳細說明。

? ??

  AAC sequence header存放的是AudioSpecificConfig結構,該結構則在“ISO-14496-3 Audio”中描述。AudioSpecificConfig結構的描述非常復雜,這里我做一下簡化,事先設定要將要編碼的音頻格式,其中,選擇"AAC-LC"為音頻編碼,音頻采樣率為44100,于是AudioSpecificConfig簡化為下表:

? ??

  這樣,AVC sequence header和AAC sequence header的內容可以基本確定了,更詳細的信息,大家可以去翻閱相關文檔。接下來就是封裝數據內容,然后交給librtmp發送。封裝格式如下所示:

? ??

運行效果

  RtmpLiveEncoder開始運行

? ??

  用FMS自帶的一個flash播放器播放

? ??

?

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

??HaibinDev軟件工作室,合作請聯系QQ。(轉載請注明作者和出處~)

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

posted on 2012-11-07 14:32 小小程序員001 閱讀(...) 評論(...) 編輯 收藏

轉載于:https://www.cnblogs.com/musicfans/archive/2012/11/07/2819290.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/260265.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/260265.shtml
英文地址,請注明出處:http://en.pswp.cn/news/260265.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java消息順序執行_Apache Flink:如何并行執行但保持消息順序?

請在下面找到使用側輸出和插槽組進行本地擴展的示例 .package org.example/** Licensed to the Apache Software Foundation (ASF) under one* or more contributor license agreements. See the NOTICE file* distributed with this work for additional information* regardi…

python的字符串定界符可以使用_使用Template格式化Python字符串的方法

對Python字符串,除了比較老舊的%,以及用來替換掉%的format,及在python 3.6中加入的f這三種格式化方法以外,還有可以使用Template對象來進行格式化。from string import Template,可以導入Template類。實例化Template類…

【ES實戰】ES6.7的tar包離線安裝幫助手冊

Elasticsearch6.7部署幫助手冊 校驗時間:2023年12月19日 文章目錄 Elasticsearch6.7部署幫助手冊安裝前準備安裝包安裝要求鎖定內存,修改最大文件描述符,最大線程數內核參數 部署規劃端口規劃用戶規劃目錄規劃 安裝步驟每個服務器配置JDK配置文件master角色node角色…

jenkins 部署文檔

Jenkins是一個非常出色的持續集成服務器,本文主要介紹在CentOS系統中Jenkins的基本安裝配置方法,供參考。一. 軟件包:1. 下載apache-maven-2.2.1-bin.tarhttp://www.apache.org/dyn/closer.cgi/maven/binaries/apache-maven-2.2.1-bin.tar.gz…

牛人,多看看他們寫的東西

計算機大師 Donald E. Knuth(高德納) 算法大師,我最崇拜的計算機科學家,沒有之一!不認識高爺爺的人別說自己是學計算機的。《The Art of Computer Programming》絕對是計算機科學的圣經。對高爺爺的崇敬,對…

System.Math.Min(System.Threading.Interlocked.Increment(i), i - 1)

System.Math.Min(System.Threading.Interlocked.Increment(i), i - 1) 在vb里面 等價于ii-1 在C#里面 等價于i-- 是有C#自動轉VB時轉換的轉載于:https://www.cnblogs.com/YaDi/archive/2012/11/08/2759802.html

java快速查找中位數_用QuickSort快速查找中位數(median)

中位數(median)是一個排好序的元素中中間位置的元素,如果元素個數為偶數,則是中間兩個元素的平均值。例如(3,1,5)的中位數是3,而(2,1,3,5)的中位數是2.5。查找中位數屬于SelectionAlgorithms的一種。用快速排序可以做到每次divide之后&#x…

python安裝mysql數據庫_windows10安裝mysql-8.0.13(zip安裝)~Python安裝mysql

windows10安裝mysql-8.0.13(zip安裝)安裝環境說明系統版本:windows10mysql版本:mysql-8.0.13-winx64.zip下載地址:http://mirrors.163.com/mysql/Downloads/MySQL-8.0/mysql-8.0.13-winx64.zip解壓安裝包解壓路徑:D:\develop\soft…

centos 下使用sublime

CentOS 之 Sublime text3 安裝及配置(不支持中文輸入) sublime text 的界面友好,自動補全功能也不錯。 (本來用vimphp_function.txt的形式進行補全的,但是配置后的補全不太滿意,放棄了。 具體參見&#xff…

20121108團隊博客(蘇若)

PS:這本是屬于昨晚的帖子,對不住忠仔。現在補上。 忠仔,終于交給了我一個實實在在的任務,很是欣喜,也很是忐忑,生怕自己不能及時完成任務。 好了,廢話不多說,步入正題。 接下任務【畫…

python 倒排索引 性能_python 實現倒排索引的方法

代碼如下:#encoding:utf-8fin open(1.txt, r)建立正向索引:“文檔1”的ID > 單詞1:出現位置列表;單詞2:出現位置列表;…………“文檔2”的ID > 此文檔出現的關鍵詞列表。forward_index {}for line in fin:line…

pythonnet下載_Python for .NET

Python for .NET 是一個可以讓 Python 程序員近乎無縫的集成 .NET 通用語言環境 CLR 和以及為 .NET 開發者提供一個強大的應用腳本工具。通過這個項目你可在 .NET 中完全使用 Python 來編寫整個應用,使用 .NET 服務和組件。這個包并沒有用 CLR 語言實現一個 Python&…

webService詳解

什么是webService WebService,顧名思義就是基于Web的服務。它使用Web(HTTP)方式,接收和響應外部系統的某種請求。從而實現遠程調用. 1:從WebService的工作模式上理解的話,它跟普通的Web程序(比如ASP、JSP等)并沒有本…

讀《有人負責,才有質量:寫給在集市中迷失的一代》總結與感想

在大伙都在吹捧“市集”開發軟件的方式的大浪潮下,作者看到了其中的不當之處,發現其中有許多的問題,因此寫下這篇文章給予吹捧“市集”的人一個提醒,甚至警告。 在該文章里,作者認為“市集”里的“農民”不可能建造出和…

php 判斷是否文件,利用PHP判斷文件是否為圖片的方法總結

前言在網頁設計中,如果需要圖片,我們通常拿到的是一個圖片的文件名。僅僅通過文件名是無法判斷該文件是否是一個圖片文件的。或許有的人以為通過后綴名就可以判斷,別忘了文件的后綴名是可以隨便改動的。更何況,在 Linux 系統下是不…

textedit怎么插入數據_還在手動插入Excel交叉空白行?這個小技巧10秒搞定

導讀:前幾天有同學在后臺提問,怎么快速在Excel中隔行插入一行或者多行空白行,其實在早期我們分享的小視頻中有利用過類似的小技巧來制作工資條,今天我們用它來插入空白行。文/ 芒種學院指北針Hello,大家好,…

python制作安裝包(setup.py)

1.制作setup.py from distutils.core import setupsetup(nameMyblog,version1.0,descriptionMy Blog Distribution Utilities,authorlujianxing,author_emaillujianxinglujianxing.com,urlhttp://blog.lujianxing.com,py_modules[foo] ) py_modules 定義 需要打包的模塊名 2.創…

[Ruby]$: 是什么意思?

ruby comes with a set of predefined variables$: default search path (array of paths)其他Ruby特殊變量: $! 最近一次的錯誤信息 $ 錯誤產生的位置 $_ gets最近讀的字符串 $. 解釋器最近讀的行數(line number) $& 最近一次與正則表達式匹配的字符串 $~ 作為…

rocketmq 啟動_016【windows版Rocketmq】小白學習Rocketmq單機部署

以前都是聽說MQ,或者在別人搭建好的基礎上去使用,沒有自己動手搭建過,就沒有更深入去理解。現在機會來啦.啦啦.啦啦啦......引用自己的CSDN文章href"https://blog.csdn.net/chenzhong2010/article/details/106699590或點擊左下角“閱讀原…

WPF WebBrowser 加載 html ,出現安全警告, 運行 腳本和 activeX 控件,

對于你的問題&#xff0c;只需要在你的HTML首行添加如下代碼即可隱藏安全提示條&#xff1a; <!-- saved from url(0014)about:internet --> 還有一個可選方案是使用Winform的WebBrowser控件&#xff0c;不需要更改HTML代碼&#xff0c;也不會出現安全提示&#xff0c;需…