音視頻處理 ffmpeg中級開發 H264編碼

開發介紹

  • libavcodec/avcodec.h
  • 常用的數據結構
    • AVCodec 編碼器結構體
    • AVCodecContext 編碼器上下文
    • AVFrame 解碼后的幀
  • 結構體內存的分配和釋放
    • av_frame_alloc 申請
    • av_frame_free() 釋放
    • avcodec_alloc_context3() 創建編碼器上下文
    • avcodec_free_context() 釋放編碼器上下文
  • 解碼步驟
    • avcodec_find_decoder 查找解碼器
    • avcodec_open2 打開解碼器
    • avcodec_decode_video2 解碼

FFMpegH264編碼

  • avcodec_find_encoder_by_name 查找編碼器
  • avcodec_open3? 設置編碼參數(分辨率、高、寬),并打開編碼器,(解碼的時候直接拷貝對應參數即可,無需再次設置)
  • avcodec_encode_video2 編碼
    • 真正執行編碼的由第三方庫進行
    • 如libx264 libopenh264
  • 注意
    • 通過ID? ? ? ?查找編/解碼器
    • 通過Name?查找編/解碼器
  • 參考鏈接:FFmpeg h264編碼 - 簡書

代碼

#include <cstdio>
#include <cstdlib>
#include <cstring>extern "C" {#include<libavutil/opt.h>#include<libavutil/imgutils.h>#include<libavcodec/avcodec.h>
}//對每一幀數據進行編碼
static void encode(AVCodecContext *enc_ctx,AVFrame *frame,AVPacket *pkt,FILE *outfile){int ret = 0;//send the frame to the encoderif (frame){printf("Send frame %3"PRId64"\n",frame->pts);}ret = avcodec_send_frame(enc_ctx,frame);if (ret < 0){fprintf(stderr,"Error sending a frame for encoding\n");exit(1);}while (ret >= 0){ret = avcodec_receive_packet(enc_ctx,pkt);if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF){return;} else if (ret < 0){fprintf(stderr,"Error during encoding\n");exit(1);}printf("Write packet %3"PRId64" (size=%5d)\n",pkt->pts,pkt->size);fwrite(pkt->data,1,pkt->size,outfile);av_packet_unref(pkt);}
}
int main(int argc,char** argv){const char *file_name,*codec_name;//輸出文件路徑和編碼器名字,由運行程序時傳入參數(要編碼的內容是從攝像頭獲取的)const AVCodec *codec;             //編碼器AVCodecContext *codec_context = nullptr;//編碼上下文環境int i,ret,x,y,got_output;         //got_output用于標記一幀是否壓縮成功FILE *file;AVFrame *frame;                   //原始幀(未壓縮的數據)AVPacket pkt;uint8_t endcode[]={0,0,1,0xb7};if (argc <= 2){fprintf(stderr,"Usage: %s <output file> <codec name>\n",argv[0]);exit(0);}file_name = argv[1];codec_name = argv[2];     //h264編碼器名字是libx264//avcodec_register_all()  //delete//通過名字查找編碼器codec = avcodec_find_encoder_by_name(codec_name);if (!codec){fprintf(stderr,"Codec not found\n");exit(1);}//生成編碼上下文環境codec_context = avcodec_alloc_context3(codec);if (!codec_context){fprintf(stderr,"Could not allocate video codec context\n");exit(1);}// 設置碼率codec_context->bit_rate = 400000;// 設置視頻寬高codec_context->width = 352;codec_context->height = 288;// 設置時間基、幀率(時間基根據幀率而變化)codec_context->time_base = (AVRational){1,25}; //一秒鐘25幀,刻度就是1/25codec_context->framerate = (AVRational){25,1}; //時間基根據幀率進行變化// 設置多少幀產生一個關鍵幀,也就是一組幀是多少幀// 如果同一個鏡頭沒有變化,只需要設定一個關鍵幀,一組幀以這個關鍵幀作為參照,從而降低數據存儲codec_context->gop_size = 10;// 設置b幀(前后參考幀)// P幀 向前參考幀codec_context->max_b_frames = 1;// 要編碼的原始數據的YUV格式codec_context->pix_fmt = AV_PIX_FMT_YUV420P;// 如果編碼器id是h264if (codec->id == AV_CODEC_ID_H264){// preset表示采用一個預先設定好的參數集,級別是slow// slow表示壓縮速度是慢的,慢的可以保證視頻質量,用快的會降低視頻質量av_opt_set(codec_context->priv_data,"preset","slow",0);}// 打開編碼器if (avcodec_open2(codec_context,codec,NULL) < 0){fprintf(stderr,"Could not open codec\n");exit(1);}file = fopen(file_name,"wb");if (!file){fprintf(stderr,"Could not open %s\n",file_name);exit(1);}// 初始化幀并設置幀的YUV格式和分辨率frame = av_frame_alloc();if (!frame){fprintf(stderr,"Could not allocate video frame\n");exit(1);}frame->format = codec_context->pix_fmt;frame->width = codec_context->width;frame->height = codec_context->height;ret = av_frame_get_buffer(frame,32);if (ret < 0){fprintf(stderr,"Could not allocate the video frame data\n");exit(1);}// 這里是人工添加數據模擬生成1秒鐘(25幀)的視頻(真實應用中是從攝像頭獲取的原始數據,攝像頭拿到數據后會傳給編碼器,然后編碼器進行編碼形成一幀幀數據。)for (i = 0; i < 25; i++) {av_init_packet(&pkt);//packet data will be allocated by the encoderpkt.data = NULL;pkt.size = 0;// 強制輸出寫入文件fflush(stdout);/* make sure the frame data is writable */ret = av_frame_make_writable(frame);if (ret < 0){exit(1);}// 下面2個循環是人工往frame里面添的數據/* Y */for (int y = 0; y < codec_context->height; y++) {for (int x = 0; x < codec_context->width; x++) {frame->data[0][y * frame->linesize[0] + x] = x + y + i*3;}}/* Cb and Cr */for (int y = 0; y < codec_context->height/2; y++) {for (int x = 0; x < codec_context->width/2; x++) {frame->data[1][y * frame->linesize[1] +x] = 128 + y + i*2;frame->data[2][y * frame->linesize[2] +x] = 64 + x + i*5;}}frame->pts = i;// 進行編碼壓縮encode(codec_context,frame,&pkt,file);}/* flush the encoder */encode(codec_context,NULL,&pkt,file);/* add sequence end code to have a real MPEG file */fwrite(endcode,1,sizeof (endcode),file);fclose(file);avcodec_free_context(&codec_context);av_frame_free(&frame);return 0;
}
  • build不出現錯誤之后,點擊run,彈出提示信息,需要輸入指定的參數
  • 進入終端頁面,進入cmake-build-debug文件夾下
  • 使用如下命令進行數據編碼?./learn_ffmpeg 1.h264 libx264
  • 生成1.h264文件
  • 使用ffplay 1.h264 進行播放
  • 本人使用開源軟件 PotPlayer進行視頻播放?

  • ?ffplay 1.h264進行視頻播放,輸出數據的相關描述信息
  • Stream #0:0: 流的ID
  • 視頻流是 h264 high
  • 數據先前的格式是 yuv420p 分辨率是353x288 幀率是25 時間基是25 流的時間基是1200 編碼的時間基是 50

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

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

相關文章

微信公眾號python人工智能回復_python實現微信機器人: 登錄微信、消息接收、自動回復功能...

安裝wxpypip install -u wxpy登錄微信# 導入模塊from wxpy import *# 初始化機器人&#xff0c;掃碼登陸bot bot()運行以上代碼&#xff0c;會生成一個二維碼&#xff0c;通過圖片掃描二維碼即可登錄微信。如果是在服務器上運行代碼&#xff0c;無法顯示圖片的時候&#xff0c…

音視頻處理 ffmpeg中級開發 視頻轉圖片

操作流程 目的&#xff1a;使用FFmpeg將視頻的每一幀數據轉換為圖片1&#xff0c;打開輸入的多媒體文件&#xff0c;檢索多媒體文件中的流信息2&#xff0c;查找視頻流的索引號&#xff0c;通過索引號獲取數據流&#xff1b;通過解析視頻流中的編碼參數得到解碼器ID&#xff0…

python非阻塞多線程socket_Python實現web服務器之 單進程單線程非阻塞實現并發及其原理...

在Python實現web服務器入門學習多進程、多線程實現并發HTTP服務器中&#xff0c;我們知道可以分別通過多進程、多線程的方式實現并發服務器&#xff0c;那么&#xff0c;是否可以通過單進程單線程的程序實現類似功能呢?實際上&#xff0c;在Python多任務學習分別通過yield關鍵…

企業知識庫與知識管理:如何統一戰略與實踐

在知識密集型的現代企業中&#xff0c;知識已經成為了一種寶貴的資產。如何有效地管理和利用這一資產&#xff0c;成為企業持續發展與創新的關鍵。企業知識庫與知識管理作為知識經濟的兩大支柱&#xff0c;它們的重要性不言而喻。但很多時候&#xff0c;我們發現企業的知識管理…

音視頻處理 ffmpeg中級開發 AAC編碼

介紹 編碼流程類似于視頻編碼&#xff0c;1&#xff0c;查找編碼器&#xff1b;2&#xff0c;設定參數&#xff0c;打開編碼器&#xff1b;3&#xff0c;數據編碼編碼函數 avcodec_encode_audio2 已經被棄用FFmpeg 過時 Api 匯總整理 - 灰色飄零 - 博客園 未成功使用 舊版本i…

虛擬機為Ubuntu分配空間

當虛擬機里面的創建的ubuntu鏡像需要更大的空間&#xff0c;將ubuntu關掉之后&#xff0c;對應調整硬盤的空間大小&#xff0c;由先前的20G上調至50G&#xff0c;但是先前的20G內存空間映射的位置是/dev/sda&#xff0c;后面增加的這段內存空間30G映射到/dev/sda1因此&#xff…

為什么人會擺高姿態_Yo , 你為什么喜歡沖浪?

“你為什么喜歡沖浪&#xff1f;” 那天木木突然問我。我愣住了。此時一道碧波恰從防潑堤&#xff08;jetty&#xff09;的那頭升起&#xff0c;木木轉頭望去&#xff0c;視線追著那道浪緩緩向西&#xff0c;直至它破碎成白色的浪花。我瞥見他眼神中的光亮&#xff0c;就和小孩…

音視頻處理 ffmpeg初級開發 命令行工具-實用命令

參考鏈接 ffmpeg Documentation作者&#xff1a;smallest_one 鏈接&#xff1a;FFmpeg命令行工具-實用命令 - 簡書 目錄 1&#xff0c;help命令使用 1.1 ffmpeg命令的語法結構1.2 獲取詳細的help信息1.3 打印幫助或者支持能力的信息1.4 全局選項1.5 文件選項1.6 視頻/音頻/字…

不同的電腦打印預覽不同怎么解決_條碼打印軟件中標簽預覽正常打印無反應怎么解決...

在使用條碼打印軟件制作標簽時&#xff0c;有客戶反饋,標簽打印預覽正常的&#xff0c;但是打印無反應&#xff0c;咨詢是怎么回事?今天針對這個情況&#xff0c;可以參考以下方法進行解決。一、預覽正常情況下&#xff0c;打印沒反應(1)在條碼打印軟件中設計好標簽之后&#…

python安裝scrapy_Python安裝Scrapy的種種

這幾天沒什么事&#xff0c;決定把自己抓代理的小工具用scrapy改寫。然而安裝的時候卻出現以下問題&#xff0c;反復失敗&#xff1a;Unable to find vcvarsall.bat經過一番查找&#xff0c;找到了這個文件&#xff1a;\Lib\distutils\_msvccompiler.py它里邊長這樣&#xff1a…

MP4文件格式的相關內容

參考鏈接 FFmpeg中mp4的demuxer(mov.c)代碼閱讀 - 簡書mp4文件格式解析 - 簡書mp4封裝格式各box類型講解及IBP幀計算_青丶空゛的博客-CSDN博客5分鐘入門MP4文件格式 - 程序猿小卡 - 博客園?關于M4A文件的隨機訪問 - 云社區 - 騰訊云 MP4文件格式相關內容 MP4文件由許多box組…

華三交換機如何進入配置_學校機房項目交換機的如何配置,理解這篇,交換機配置不再難...

弱電項目中&#xff0c;交換機的配置是無法避免的&#xff0c;大部分的項目都有可能會涉及到&#xff0c;尤其是機房等網絡項目&#xff0c;本期我們就通過一個實際項目案例來詳細了解交換機在項目中的應用配置&#xff0c;如果我們平時對交換機配置不熟&#xff0c;這個案例可…

百度地圖遷徙大數據_百度地圖大數據:五一高速擁堵不似預期,廣深成熱門遷出入地...

五一假期在即&#xff0c;你是否做好了“出行功課”&#xff1f;高速擁堵水平降低、公眾出門不出城、公園成踏青賞景熱門目的地……在全國疫情防控仍未松懈的時刻&#xff0c;2020年的五一或許注定與往年不同。近日&#xff0c;百度地圖發布2020五一假期安全出行大數據&#xf…

音視頻的基礎知識 視頻播放器原理/封裝格式/視頻音頻編碼數據/視頻像素數據/音頻采樣數據

參考鏈接 FFMpeg視頻播放器的制作-雷霄驊&#xff08;去除電流音版本&#xff09;_嗶哩嗶哩_bilibili 視頻播放器原理 播放視頻文件的流程YUV是一張屏幕中像素點的數值封裝格式 MP4 RMVB TS FLV AVI將視頻和音頻碼流按照一定的格式存儲在一個文件中封裝格式分析工具&#xf…

科立捷7代寫頻軟件_天大廈大“兩碩士論文雷同”通報,代寫買賣論文

澎湃新聞記者 薛莎莎天津大學、廈門大學7月10日晚就“兩碩士論文雷同”一事&#xff0c;分別發出調查處理通報。通報稱&#xff0c;涉事兩名學生存在由他人代寫、買賣論文的學術作假的行為&#xff0c;均撤銷其所獲碩士學位&#xff0c;收回、注銷碩士學位證書。澎湃新聞注意到…

FFMpeg命令行基礎

參考鏈接 FFMpeg視頻播放器的制作-雷霄驊&#xff08;去除電流音版本&#xff09;_嗶哩嗶哩_bilibili音視頻處理 ffmpeg初級開發 命令行工具-實用命令_MY CUP OF TEA的博客-CSDN博客 介紹 FFMpeg是視頻播放和轉碼的內核 使用 win中ffmpeg.exe用于視頻轉碼簡單命令&#xff1…

悲觀鎖和樂觀鎖_面試必備之樂觀鎖與悲觀鎖

何謂悲觀鎖與樂觀鎖樂觀鎖對應于生活中樂觀的人總是想著事情往好的方向發展&#xff0c;悲觀鎖對應于生活中悲觀的人總是想著事情往壞的方向發展。這兩種人各有優缺點&#xff0c;不能不以場景而定說一種人好于另外一種人。大家可以點擊加群【JAVA架構知識學習討論群】47398464…

Microsoft Visual Studio2019環境下搭建FFmpeg開發環境

參考鏈接 《基于 FFmpeg SDL 的視頻播放器的制作》課程的視頻_雷霄驊的博客-CSDN博客_雷霄驊ffmpeg視頻教程小學期課程資料 - 基于FFmpegSDL的視頻播放器的制作.zip_免費高速下載|百度網盤-分享無限制輔助參考鏈接使用VS2019創建項目&#xff0c;添加文件和庫地址_MY CUP OF …

vue process.env獲取不到_從文檔開始,重學vue(下)源碼級別

此篇文章主要是從應用及源碼層面講解vue部分常用api,閱讀起來可能略有難度,新手可以看《從文檔開始,重學vue(上)》示例代碼均在vue-cli3中完成Vue.extend()可以使用 extend 創建一個子類,該方法通常用于構建全局組件,如彈框組件等,下面我們就用它來制作個全局alert組件吧首先我…

Microsoft Visual Studio2019環境下搭建SDL開發環境

參考鏈接 《基于 FFmpeg SDL 的視頻播放器的制作》課程的視頻_雷霄驊的博客-CSDN博客_雷霄驊ffmpeg視頻教程小學期課程資料 - 基于FFmpegSDL的視頻播放器的制作.zip_免費高速下載|百度網盤-分享無限制輔助參考鏈接VS自動鏈接到Windows上隨vcpkg安裝的SDL2庫 | 碼農俱樂部 - G…