1. 程式人生 > >ffmpeg攝像頭採集h264編碼RTP傳送

ffmpeg攝像頭採集h264編碼RTP傳送

一. 相關API說明

1. av_register_all 
2. avformat_network_init 
    不管是流媒體傳送還是流媒體接收, 需要先執行該函式. 
3. avformat_alloc_context 
    初始化一個AVFormatContext. 
4. avcodec_alloc_frame
    初始化1個AVFrame. **需要注意的是,新版的FFmpeg使用av_frame_alloc來初始化一個AVFrame.**
5. av_guess_format
    返回一個已經註冊的最合適的匹配輸入引數地輸出格式.
6. avio_open
    開啟FFmpeg的輸入輸出檔案. **需要注意的是, 新版的Ffmpeg使用avio_open2來開啟輸入輸出檔案.**
7. avcodec_find_encoder
    通過code ID查詢一個已經註冊的音視訊編碼器.
8. avformat_new_stream
    初始化一個AVStream. **銷燬函式使用銷燬AVFormatContext的avformat_free_context()就可以了**
9. avcodec_get_context_defaults3
    用於設定該AVCodecContext的預設值.
10. av_opt_set
    設定一個AVOption的值.
11. avcodec_open2
    開啟編碼器.
12. avformat_write_header
    寫檔案頭.
13. av_sdp_create
    列印sdp資訊.
14. av_init_packet
     使用預設值初始化AVPacket.
15. avcodec_encode_video2
    編碼一幀視訊資料.
16. av_rescale_q
    用於計算Packet的PTS.
17. av_interleaved_write_frame
    寫入一個AVPacket到輸出檔案.
18. av_free_packet
    銷燬一個AVPacket. 
19. av_frame_free
    銷燬一個AVFrame. 
20. avcodec_close
    關閉編碼器.
21. av_free
    av_free()簡單的封裝了free.
22. avformat_free_context
    銷燬一個AVFormatContext.

二. 工作流程

1. 初始化, 依次完成以下工作
    av_register_all();

    //使用RTSP網路流時必須先執行
    avformat_network_init();                                                             
    pFrame = avcodec_alloc_frame();                                              
    fmtctx = avformat_alloc_context();         

     //設定流格式為RTP                                   
    fmtctx->oformat = av_guess_format("rtp", NULL, NULL);         
    //用指定IP和埠構造輸出流地址
    sprintf(fmtctx->filename,"rtp://%s:%d",SendIp.toLatin1().data(),SendPort);

    //開啟輸出流
    avio_open(&fmtctx->pb,fmtctx->filename, AVIO_FLAG_WRITE);

    //查詢編碼器
    *codec = avcodec_find_encoder(codec_id);

    //初始化AVStream
    st = avformat_new_stream(oc, *codec);

    //設定AVCodecContext編碼引數    
    avcodec_get_context_defaults3(c, *codec);
    c->codec_id = codec_id;
    c->codec_type = AVMEDIA_TYPE_VIDEO;
    c->width = capWidth;
    c->height = capHeight;
    c->time_base.den = frameRate;
    c->time_base.num = 1;
    c->pix_fmt = AV_PIX_FMT_YUV420P;   //PIX_FMT_YUV420P;
    if(oc->oformat->flags & AVFMT_GLOBALHEADER)
        c->flags|= CODEC_FLAG_GLOBAL_HEADER;

    av_opt_set(c->priv_data, "preset", "slow", 0);
    av_opt_set(c->priv_data, "tune","zerolatency",0);
    av_opt_set(c->priv_data, "x264opts","crf=26:vbv-maxrate=728:vbv-bufsize=3640:keyint=25",0);

    //開啟編碼器
    avcodec_open2(video_st->codec, video_codec, NULL);

    //寫檔案頭
    avformat_write_header(fmtctx, NULL);

    //列印SDP資訊, 該資訊可用於Rtp流接收解碼
    av_sdp_create(&fmtctx,1, sdp, sizeof(sdp));
2. 視訊編碼, rtp傳輸.  該處使用一個單獨的執行緒完成.
    while (1) 
    {
        //退出執行緒, 略

        //獲取RGB影象
        cap>>srcMat;

        //格式轉換, BGR->YUV420P
        convertMatBGR2YUV420(dstMat ,yMat,uMat,vMat);

        //構造AVPacket.
        av_init_packet(&pkt);

        pFrame->pts = video_st->codec->frame_number;

         //視訊編碼
        avcodec_encode_video2(c, &pkt,pFrame, &got_output);
        if (got_output) {
            if (c->coded_frame->key_frame)
                pkt.flags |= AV_PKT_FLAG_KEY;
            pkt.stream_index = st->index;

            //計算PTS
            if (pkt.pts != AV_NOPTS_VALUE ) {
                pkt.pts = av_rescale_q(pkt.pts,video_st->codec->time_base, video_st->time_base);
            }
            if(pkt.dts !=AV_NOPTS_VALUE ) {
                pkt.dts = av_rescale_q(pkt.dts,video_st->codec->time_base, video_st->time_base);
            }

            //寫入一個AVPacket到輸出檔案, 這裡是一個輸出流
            av_interleaved_write_frame(oc,&pkt);
        }

        //銷燬AVPacket.
        av_free_packet(&pkt);
    }

    //銷燬資源
    av_frame_free(&pFrame);
    avcodec_close(video_st->codec);
    av_free(video_st->codec);
    avformat_free_context(fmtctx);

3. 其他, 略.

三. 執行
程式執行後
點選”開啟”按紐, 啟動RTP傳輸.
這裡寫圖片描述

RTP接收
這裡寫圖片描述

相關推薦

ffmpeg攝像頭採集h264編碼RTP傳送

一. 相關API說明 1. av_register_all 2. avformat_network_init 不管是流媒體傳送還是流媒體接收, 需要先執行該函式. 3. avformat_alloc_context 初始化一個AVFo

利用ffmpeg進行攝像頭提取視訊編碼h264通過RTP傳送資料到指定的rtp地址

話不多說命令如下: ffmpeg -f dshow -i video="Logitech QuickCam Easy/Cool" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -f rtp rtp://127

centos 安裝ffmpeg 及h264編碼打包

得到 ins ann 並保存 entos 情況 進入 h264 錯誤信息 切記刪除原有ffmpeg1、編譯yasm。./configure --prefix=/usr/local/yasmmakemake install2、解壓x264,進入目錄,輸入:./configur

ffmpeg 壓縮攝像頭採集的圖片為*.H264檔案

主要用opencv開啟攝像頭,採集到資料後,傳輸給ffmpeg ,壓縮為h264資料,h264的檔案可以直接拖到vcl播放器播放 MyEncoder.h #pragma once extern "C" { #include <libavcodec/av

android平臺,利用ffmpeg對android攝像頭採集編碼

對於這個問題,我也是折騰了好幾天終於把這個問題解決了。不多說,進入主題: 首先是demo下載地址:http://download.csdn.net/detail/zh_ang_hua/8971915; 這個下載地址demo有bug,已修改,新的現在地址:http://d

FFmpeg基礎知識之————H264編碼profile & level控制

ace ffmpeg 基礎 pla evel 存儲 領域 super 輸出 H.264有四種畫質級別,分別是baseline, extended, main, high: 1、Baseline Profile:基本畫質。支持I/P 幀,只支持無交錯(Progres

02 使用FFmpeg庫, YUV420轉H264編碼

yuv420轉h264編碼 使用ffmpeg庫 演示環境:CentOS 7FFmpeg的H264編碼,需要x264庫支持[root@localhost ~]# wget ftp://ftp.videolan.org/pub/x264/snapshots/last_x264.tar.bz2 [root@

FFmpeg 4.0.2編碼YUV序列為H264視訊檔案

/****************************** 功能:編碼YUV序列為h264視訊檔案 FFmpeg:4.0.2 ******************************/ #include <iostream> extern "C" { #include &

FFmpeg命令:幾種常見場景下的FFmpeg命令(攝像頭採集推流,桌面錄製推流、轉流,拉流等等)

前提: 再者,推流你得有個流媒體服務,個人測試用小水管:rtmp://eguid.cc:1935/rtmp/test(小水管,請儘量錯開時間使用,另切記推流視訊位元速率不要太高,避免佔用太多頻寬)

linux下編譯ffmpeg,並加入H264編碼支援

1.libx264 編譯 ./configure --enable-static --disable-asm --prefix=/usr/local/ffmpegRedHat make make in

攝像頭採集,264編碼,live555直播(1)

1.首先需要修改live555,定義從 記憶體中直接獲取source而不是從檔案讀取source的類。 自己實現的類命名為 H264FramedLiveSource  /* * Filename: H264FramedLiveSource.hh * Au

ffmpeg用來進行編碼解碼,live555用來進行傳輸rtsp、rtp

本文概要:                 本文介紹了一種常用成熟的多媒體解碼方案。使用live555作為流媒體資料來源,建立rtsp會話請求h264資料流。後端使用ffmpeg解碼h264流並儲存為yuv420格式。                 該方案比較成熟,可

Android攝像頭採集的視訊資料流如何通過Socket實時傳送到目標服務端

分兩塊: 1.取得攝像頭採集的視訊流 2.傳送到伺服器端 protected MediaRecorder mMediaRecorder; private LocalServerSocket mLss = null; private LocalSock

H264 NALU 使用PS封裝 RTP傳送

最近由於專案平臺需求,要將H264 NALU封裝為PS再用RTP傳送,PS封裝按照ISO DEC-13818-1標準。一個PS包包含PS Header, PES Header, PS system header, PS system map等。 針對H264做如下PS封裝: 1、每個IDR NALU前一般都

FFmpeg獲取攝像頭資料並編碼為H.264

       ffmpeg的視音訊編解碼功能非常強大,可以說包括了所有的視音訊編碼標準。在這裡我主要是呼叫ffmpeg工程裡的ffmpeg.exe檔案,呼叫之後,會自動完成編碼的操作。內部編碼的具體流程,以後再慢慢的看。1.介紹       先介紹下ffmpeg裡面的三個ex

FFMPEGH264編碼封裝mp4 有聲音無影象。或者解碼錯誤

那是因為解碼時用到的sps,pps資訊缺失。  out_stream = avformat_new_stream(ptrBoxObj->ofmt_ctx, NULL);   if (!out_stream) {    av_log(NULL, AV_LOG_ERROR

ffmpeg實現windows螢幕錄製YUV420P並實現H264編碼

完整工程下載https://download.csdn.net/download/iot_shun/10313142首先之前我們的程式碼利用gdigrab已經實現了螢幕錄製功能,可是我們發現,儲存的YYU42OP檔案實現太大,100張150M,在音視訊實時傳輸的過程中我們需要

ffmpeg編碼之RGB通過H264編碼並封裝成mp4

原始rgb檔案 h264編碼成功,並封裝成MP4檔案 執行截圖 日誌資訊 實現方式 extern "C" { #include <libavformat/avformat.h> #include <libswscale/

使用ffmpeg將BMP圖片編碼為x264視訊檔案,將H264視訊儲存為BMP圖片,yuv視訊檔案儲存為圖片的程式碼

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <windows.h> #ifdef __cplusplus extern "C" { #endif #include

OpenCv + ffmpeg + rtmp 實現攝像頭採集資料直播功能

採用OpenCv獲取影象資料,通過ffmpeg推流給rtmp伺服器 OpenCV獲取的影象資料為BGR格式,需要轉換成YUV格式