rtmp視頻流提取h264裸流

流媒體服務(wù)器在判斷出消息類(lèi)型為video之后,進(jìn)行h264參數(shù)集和nalu的提取,并加入分隔符巨坊,代碼如下
文中用讀取文件的方式代替rtmp msg里面的payload
rtmp視頻消息示例:

image.png

。。茫虽。刊苍。


image.png
#include <string>
#include <sstream>

FILE *f264 = NULL;

uint16_t ReadU16BE(uint8_t data[2]) {
    uint16_t v = 0;

    uint16_t v1 = uint16_t(data[0]);
    v1 <<= 16;

    uint16_t v2 = uint16_t(data[1]);

    v |= v1;
    v |= v2;

    return v;
}

uint32_t ReadU32BE(uint8_t data[4]) {
    uint32_t v = 0;

    uint32_t v1 = uint32_t(data[0]);
    v1 <<= 24;

    uint32_t v2 = uint32_t(data[1]);
    v2 <<= 16;

    uint32_t v3 = uint32_t(data[2]);
    v3 <<= 8;

    uint32_t v4 = uint32_t(data[3]);

    v |= v1;
    v |= v2;
    v |= v3;
    v |= v4;

    return v;
}

void write_h264nalu_to_disk(char *nalu, int nalu_len) {
    char separator[4] = {0x00, 0x00, 0x00, 0x01};

    fwrite(separator, 1, 4, f264);
    fwrite(nalu, 1, nalu_len, f264);
}

void parse_one_frame(char *payload, int payload_size) {
    char frame_type = payload[0];
    frame_type = (frame_type >> 4) & 0x0F;


    char avc_packet_type = payload[1];
    if (1 == frame_type && 0 == avc_packet_type)// spspps. 17 00
    {
        //sps
        int offset = 0;
        offset += 11;

        int sps_len = payload[offset] * 16 + payload[offset + 1];
        offset += 2;

        write_h264nalu_to_disk(&payload[offset], sps_len);
        offset += sps_len;

        //pps
        offset += 1; //pps num.
        char nalu_len_data[2] = {payload[offset], payload[offset + 1]};
        int pps_len = ReadU16BE((uint8_t *) nalu_len_data);
        offset += 2;

        offset + pps_len;
        write_h264nalu_to_disk(&payload[offset], pps_len);

    } else if (1 == avc_packet_type) // nalu
    {
        int offset = 0;
        offset += 5;

        while (offset < payload_size) {
            char nalu_len_data[4] = {payload[offset], payload[offset + 1], payload[offset + 2], payload[offset + 3]};
            int nalu_len = ReadU32BE((uint8_t *) nalu_len_data);

            offset += 4;

            write_h264nalu_to_disk(&payload[offset], nalu_len);
            offset += nalu_len;
        }
    }
}

int main() {
    std::string path = "/home/yangkai/CLionProjects/jvsrs/trunk/cmake-build-debug/origin/";

    enum {
        READ_EVERY_TIME = 128
    };

    char *payload = new char[1 * 1024 * 1024];
    int payload_size = 0;

    f264 = fopen("end.264", "wb+");

    for (int i = 0; i < 1956; ++i) {
        std::stringstream ss;
        ss << path << "origin-" << i << ".h264";

        FILE *f = fopen(ss.str().c_str(), "rb");
        while (1) {
            int readsize = fread(payload + payload_size, 1, READ_EVERY_TIME, f);
            payload_size += readsize;

            if (readsize != READ_EVERY_TIME) {
                break;
            }
        }
        fclose(f);

        parse_one_frame(payload, payload_size);
        payload_size = 0;

    }

    delete[] payload;
    fclose(f264);

    return 0;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市濒析,隨后出現(xiàn)的幾起案子正什,更是在濱河造成了極大的恐慌,老刑警劉巖号杏,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件婴氮,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡盾致,警方通過(guò)查閱死者的電腦和手機(jī)主经,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)庭惜,“玉大人罩驻,你說(shuō)我怎么就攤上這事』ど蓿” “怎么了惠遏?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)骏啰。 經(jīng)常有香客問(wèn)我节吮,道長(zhǎng),這世上最難降的妖魔是什么判耕? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任透绩,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘渺贤。我一直安慰自己雏胃,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布志鞍。 她就那樣靜靜地躺著瞭亮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪固棚。 梳的紋絲不亂的頭發(fā)上统翩,一...
    開(kāi)封第一講書(shū)人閱讀 51,365評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音此洲,去河邊找鬼厂汗。 笑死,一個(gè)胖子當(dāng)著我的面吹牛呜师,可吹牛的內(nèi)容都是我干的娶桦。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼汁汗,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼衷畦!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起知牌,我...
    開(kāi)封第一講書(shū)人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤祈争,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后角寸,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體菩混,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年扁藕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了沮峡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡亿柑,死狀恐怖帖烘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情橄杨,我是刑警寧澤秘症,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站式矫,受9級(jí)特大地震影響乡摹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜采转,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一聪廉、第九天 我趴在偏房一處隱蔽的房頂上張望瞬痘。 院中可真熱鬧,春花似錦板熊、人聲如沸框全。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)津辩。三九已至,卻和暖如春容劳,著一層夾襖步出監(jiān)牢的瞬間喘沿,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工竭贩, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蚜印,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓留量,卻偏偏與公主長(zhǎng)得像窄赋,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子楼熄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理忆绰,服務(wù)發(fā)現(xiàn),斷路器孝赫,智...
    卡卡羅2017閱讀 134,654評(píng)論 18 139
  • 首先我們獲得h264的流较木,在監(jiān)聽(tīng)里红符,我們通過(guò)參數(shù)可以獲得RTMP包 IStreamPacket青柄,調(diào)用getData...
    userName閱讀 3,538評(píng)論 0 52
  • 轉(zhuǎn)發(fā)自 2016-10-27李智文騰訊Bugly 概要 分享內(nèi)容: 互聯(lián)網(wǎng)內(nèi)容載體變遷歷程,文字——圖片/聲音——...
    樹(shù)懶啊樹(shù)懶閱讀 11,989評(píng)論 3 123
  • 實(shí)時(shí)消息協(xié)議---流的分塊 版權(quán)聲明: 版權(quán)(c)2009 Adobe系統(tǒng)有限公司预侯。全權(quán)所有致开。 摘要: 本備忘錄描...
    一個(gè)人zy閱讀 1,899評(píng)論 0 9
  • 選自詩(shī)集《薔薇花開(kāi)》: 寫(xiě)詩(shī)是一種生活方式 寫(xiě)詩(shī)最好的時(shí)候 當(dāng)然是夜深人靜的午夜 午夜的詞語(yǔ) 會(huì)情不自禁地攀爬指尖...
    湖北雪兒閱讀 255評(píng)論 3 6