1. 程式人生 > >利用ffmpeg錄製rtsp流的方法總結(一)

利用ffmpeg錄製rtsp流的方法總結(一)

這裡主要結合平時對音視訊的學習,將ffmpeg錄製rtsp的方法在這裡記錄下。

首先,一般的錄製過程都是按照如下的流程圖進行錄製,除非某些不存在音訊的特殊情況。

 這個是總體的錄製流程,然而這個流程對於推流來說也適用。因此對於流程中每一步的實現,需要弄明白。

在進入主題之前,有必要對視訊的基礎知識有一個瞭解,這是十分有必要的。

 封裝格式:MP4,RMVB,TS,FLV,AVI

視訊編碼格式:H264,MPEG2,VC-1

音訊編碼格式:AAC,MP3,AC-3,G711

視訊畫素格式:YUV,RGB

音訊畫素格式:PCM

       一般錄製過程中,原始視訊音訊編碼格式可能與我們所期待的格式或者引數不同,這需要對音視訊進行解碼後,重新進行編碼,然後封裝成我們所需要的格式。其中難點包括音視訊的編解碼,以及視訊格式封裝。

我們在錄製rtsp流之前,需要了解我們所獲取的流的相關資訊。

這個我們可以通過av_dump_format()函式檢視。

可以通過網上給定測試的rtsp流地址進行測試:rtsp://184.72.239.149/vod/mp4://BigBuckBunny_175k.mov

此部分所引用ffmpeg庫為4.0版本

#include<iostream>
extern "C"{
#include <libavformat/avformat.h>
}
using namespace std;

int OpenRtspStream(const char* url,AVFormatContext **ic)
{
    AVDictionary* options = NULL;
    int ret=-1;
    ret=av_dict_set(&options,"rtsp_transport", "tcp", 0);  
    if(ret<0)
        return -1;
    ret=av_dict_set(&options,"stimeout","10000000",0);
    if(ret<0)
        return -1;
    if(avformat_open_input(ic,url,NULL,&options)!=0)          //avformat_close_input 關閉
    {
        if(!(*ic))
            avformat_free_context(*ic);
        return -1;
    }
    if(avformat_find_stream_info(*ic,NULL)<0)
    {
        if(!(*ic))
        {
            avformat_close_input(ic);
            avformat_free_context(*ic);
        }
        return -1;    
    }
    
    printf("-----------rtsp流輸入資訊--------------\n");
    av_dump_format(*ic, 0, url,0);
    printf("---------------------------------------\n");
    printf("\n");
    return 0;
}


void main()
{
         AVFormatContext *ifmt=NULL;
    ifmt=avformat_alloc_context();
    if(!ifmt)
    {
        cout<<"avformatcontext alloc error"<<endl;
                    goto end;
    }
    ret=OpenRtspStream(url,&ifmt);
    if(ret<0)
    {
        cout<<"攝像機網路不通"<<endl;        
        goto end;
    }
end:
           getchar();
}

通過列印的資訊可以知道所獲取到的流中視訊和音訊的編碼格式。如果與我們目標格式不一致,就需要進行相應的轉碼。

下面將開始介紹如何進行rtsp流儲存為MP4檔案的方法。

目前比較常用生成MP4檔案方法有兩種:

1.通過ffmpeg進行MP4封裝

2.通過第三方庫MP4V2進行封裝

後面將分別具體介紹這兩種方法的封裝。

相關推薦

利用ffmpeg錄製rtsp方法總結

這裡主要結合平時對音視訊的學習,將ffmpeg錄製rtsp的方法在這裡記錄下。 首先,一般的錄製過程都是按照如下的流程圖進行錄製,除非某些不存在音訊的特殊情況。  這個是總體的錄製流程,然而這個流程對於推流來說也適用。因此對於流程中每一步的實現,需要弄明白。 在進入

HBase性能優化方法總結

rec inter next memstore 不支持 lena cred 追加 查詢效率 一 表的設計 1.1 Pre-Creating Regions 默認情況下,在創建HBase表的時候會自動創建一個region分區,當導入數據的時候,所有的HBase客戶端都向這

手機端web頁除錯方法總結

如何檢視app中web頁的原始碼: 目前可用的解決辦法是使用Chrome瀏覽器提供的“”檢查裝置“”功能。 準備:最新的Chrome版本,vpn賬號(使用該功能需要翻牆),一根資料線。 準備完畢之後,將手機通過資料線連線到電腦,最好電腦下載一個手機助手,確保USB已連線上。

web測試方法總結

一、輸入框 1、字元型輸入框: (1)字元型輸入框:英文全形、英文半形、數字、空或者空格、特殊字元“~!@#¥%……&*?[]{}”特別要注意單引號和&符號。禁止直接輸入特殊字元時,使用“貼上、拷貝”功能嘗試輸入。 (2)長度檢查:最小長度、最大長度、最小長度-1、最大長度+1、輸入超工字元

機器學習方法總結

機器學習方法概論    說明:本教程的主要目的是個人秋招復習,適用於一些有基礎的同學進行復習,主要來自於對統計學習方法和西瓜書的整理,所以不適用於系統學習,詳細內容大家可以看書。其中加入個人的理解和各個演算法是例項,由於理解不夠導致的錯誤還請各位指出。  1.特點與分

IO學習總結

什麼是IO流IO流之前也接觸了好多次,因為這一塊內容很多,所以老是有不太清楚的地方,所以現在來總結一下。流分為位元組流,字元流。簡單的說,位元組流就是由二進位制資料組成的流,一個位元組八個bit,這個計算機很容易理解,但是不方便人閱讀,所以就有了字元流。字元流,有不同的編碼方

Java IO學習總結

rar output 出現 arr system 不存在 技術分享 輸出 寫入 原文地址:http://www.cnblogs.com/oubo/archive/2012/01/06/2394638.html Java流操作有關的類或接口: Java流類圖結構:

Linux查看日誌方法總結1

關鍵字 http grep 定時 abd cab 我們 做的 ext 註:日誌文件為:test.log 1.tail -f test.log 查看當前打印的日誌(平時就知道這方法!打印出的長度有限制。) 以下為網上搜集的: 2.先必須了解兩個最基本的命令: tai

STL使用方法總結入門

初始 元素 索引 ID 指針 內容 size con mil Iterator 用於操作復雜的數據結構,類似於指針,指向數據結構的位置,*it用於讀取數據 關於嵌套容器的叠代器使用: set< vector<int> >::iterator it;

HttpServletRequest 各種方法總結

請求 客戶端 values AI 服務器程序 去重 request 字符串 重新   HttpServletRequest對象代表客戶端的請求,當客戶端通過HTTP協議訪問服務器時,HTTP請求頭中的所有信息都封裝在這個對象中,開發人員通過這個對象的方法,可以獲得客戶這些信

Butterknife--Android Butterknife使用方法總結

black inner 混淆 ora RoCE max 通過 要點 vat 原文鏈接:http://blog.csdn.net/donkor_/article/details/77879630 前言: ButterKnife是一個專註於Android系統的View註入框架,

java基本運算方法總結ing

方法 運算 sys 隨機數 mat ... 方法總結 clas math 邊學邊總結... 1、冪的運算 Math.pow(a,b) 2、隨機數的方法 System.currentTimeMillis()    Math.randow() 3、絕對值的運算

前端開發框架總結利用Jtopo實現網路拓撲功能

                      前端開發框架總結之利用Jtopo實現網路拓撲功能(一) 前言:     前段時間由於專案需要實現一個網路裝置拓撲管理的

String類中的equals方法總結轉載

轉載:https://blog.csdn.net/qq_25827845/article/details/53868815 1.String原始碼中equals大致寫法: 1 public boolean equals(Object anObject) { 2 if (this == anObj

9.27 IO學習總結

在學習IO流之前我們今天先學習了遞迴。 遞迴 遞迴:就是在方法定義中呼叫方法本身的現象。 在使用遞迴時,必須有一個明確的遞迴結束條件,稱為遞迴出口。 下面舉個例子: 1.用遞迴來實現斐波那契額數列,如1,1,2,3,5,8,13…,輸出前20項的和。 publi

web測試方法總結

十四、連結測試 主要是保證連結的可用性和正確性,它也是網站測試中比較重要的一個方面。 可以使用特定的工具如XENU來進行連結測試。1導航測試 導航描述了使用者在一個頁面內操作的方式,在不同的使用者介面控制之間,例如按鈕、對話方塊、列表和視窗等;或在不同的連線頁面之間。通過考

web測試方法總結

十二、介面和易用性測試 1、風格、樣式、顏色是否協調 2、介面佈局是否整齊、協調(保證全部顯示出來的,儘量不要使用滾動條 3、介面操作、標題描述是否恰當(描述有歧義、注意是否有錯別字) 4、操作是否符合人們的常規習慣(有沒有把相似的功能的控制元件放在一起,方便操作) 5、提

Java基礎總結物件,類,屬性,方法

物件,類,屬性,方法的解析: 以人為例。 類:人可以看作一個類。 物件:具體到什麼人(黃種人,白種人,黑種人,中國人等等)這就可以看作是物件,可以根據需求繼續往下區分,比如 男人 女人。 屬性:比如說黃種人的特點:黃面板,黑頭髮,黑眼睛等等,這些就是黃

池化方法總結Pooling 和卷積 。 第三部分講的很好

影象大小與引數個數: 前面幾章都是針對小影象塊處理的,這一章則是針對大影象進行處理的。兩者在這的區別還是很明顯的,小影象(如8*8,MINIST的28*28)可以採用全連線的方式(即輸入層和隱含層直接相連)。但是大影象,這個將會變得很耗時:比如96*96的影象,若採用全連線方式,需要96*96個

直播技術總結媒體伺服器搭建,進行推

前言:直播技術,近年來,相當火,先且不說Codec部分,那它到底複雜麼? 服務端推流,客戶端進行拉流,兩者結合,變成直播,應該說如何優化直播的實時性中的問題,才是複雜部分,如網路原因,如視訊卡頓等。今天介紹直播技術總結中流媒體伺服器搭建,進行推流,用Mac搭