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
FFMPEG 用H264編碼封裝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格式