1. 程式人生 > >ffmpeg 壓縮攝像頭採集的圖片為*.H264檔案

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

主要用opencv開啟攝像頭,採集到資料後,傳輸給ffmpeg ,壓縮為h264資料,h264的檔案可以直接拖到vcl播放器播放

MyEncoder.h

#pragma once
extern "C"
{
#include <libavcodec/avcodec.h>
#include <libavdevice/avdevice.h>
#include<libavfilter/avfilter.h>
#include <libswscale/swscale.h>
#include <libswresample/swresample.h>
#include <libavformat/avformat.h>
#include <libavutil/avutil.h> #include <libavutil/imgutils.h> } class MyEncoder { public: MyEncoder(); public: AVFrame *m_pRGBFrame; //幀物件 AVFrame *m_pYUVFrame; //幀物件 AVCodec *pCodecH264; //編碼器 AVCodecContext *c; //編碼器資料結構物件 uint8_t *yuv_buff; //yuv影象資料區
uint8_t *rgb_buff; //rgb影象資料區 SwsContext *scxt; //影象格式轉換物件 uint8_t *outbuf; //編碼出來視訊資料快取 int outbuf_size; //編碼輸出資料去大小 int nDataLen; //rgb影象資料區長度 int width; //輸出視訊寬度 int height; //輸出視訊高度 AVPacket pkt; //資料包結構體
public: void Ffmpeg_Encoder_Init();//初始化 void Ffmpeg_Encoder_Setpara(AVCodecID mycodeid, int vwidth, int vheight);//設定引數,第一個引數為編碼器,第二個引數為壓縮出來的視訊的寬度,第三個視訊則為其高度 void Ffmpeg_Encoder_Encode(FILE *file, uint8_t *data);//編碼並寫入資料到檔案 void Ffmpeg_Encoder_Close();//關閉 };

MyEncoder.cpp

#include "MyEncoder.h"

MyEncoder::MyEncoder()
{
}

void MyEncoder::Ffmpeg_Encoder_Init()
{
    av_register_all();
    avcodec_register_all();

    m_pRGBFrame = new AVFrame[1];//RGB幀資料賦值    
    m_pYUVFrame = new AVFrame[1];//YUV幀資料賦值    

    c = NULL;//解碼器指標物件賦初值  
}

void MyEncoder::Ffmpeg_Encoder_Setpara(AVCodecID mycodeid, int vwidth, int vheight)
{
    pCodecH264 = avcodec_find_encoder(mycodeid);//查詢h264編碼器  
    if (!pCodecH264)
    {
        fprintf(stderr, "h264 codec not found\n");
        exit(1);
    }
    width = vwidth;
    height = vheight;

    c = avcodec_alloc_context3(pCodecH264);//函式用於分配一個AVCodecContext並設定預設值,如果失敗返回NULL,並可用av_free()進行釋放  
    c->bit_rate = 400000; //設定取樣引數,即位元率  
    c->width = vwidth;//設定編碼視訊寬度   
    c->height = vheight; //設定編碼視訊高度  
    c->time_base.den = 2;//設定幀率,num為分子和den為分母,如果是1/25則表示25幀/s  
    c->time_base.num = 1;
    c->gop_size = 10; //設定GOP大小,該值表示每10幀會插入一個I幀  
    c->max_b_frames = 1;//設定B幀最大數,該值表示在兩個非B幀之間,所允許插入的B幀的最大幀數  
    c->pix_fmt = AV_PIX_FMT_YUV420P;//設定畫素格式  

    av_opt_set(c->priv_data, "tune", "zerolatency", 0);//設定編碼器的延時,解決前面的幾十幀不出資料的情況  

    if (avcodec_open2(c, pCodecH264, NULL) < 0)return;//開啟編碼器  

    nDataLen = vwidth*vheight * 3;//計算影象rgb資料區長度  

    yuv_buff = new uint8_t[nDataLen / 2];//初始化資料區,為yuv影象幀準備填充快取  
    rgb_buff = new uint8_t[nDataLen];//初始化資料區,為rgb影象幀準備填充快取  
    outbuf_size = 100000;////初始化編碼輸出資料區  
    outbuf = new uint8_t[outbuf_size];

    scxt = sws_getContext(c->width, c->height, AV_PIX_FMT_BGR24, c->width, c->height, AV_PIX_FMT_YUV420P, SWS_POINT, NULL, NULL, NULL);//初始化格式轉換函式  
}

void MyEncoder::Ffmpeg_Encoder_Encode(FILE *file, uint8_t *data)
{
    av_init_packet(&pkt);
    memcpy(rgb_buff, data, nDataLen);//拷貝影象資料到rgb影象幀快取中準備處理  
    avpicture_fill((AVPicture*)m_pRGBFrame, (uint8_t*)rgb_buff, AV_PIX_FMT_RGB24, width, height);//將rgb_buff填充到m_pRGBFrame  
    //av_image_fill_arrays((AVPicture*)m_pRGBFrame, (uint8_t*)rgb_buff, AV_PIX_FMT_RGB24, width, height);
    avpicture_fill((AVPicture*)m_pYUVFrame, (uint8_t*)yuv_buff, AV_PIX_FMT_YUV420P, width, height);//將yuv_buff填充到m_pYUVFrame  
    sws_scale(scxt, m_pRGBFrame->data, m_pRGBFrame->linesize, 0, c->height, m_pYUVFrame->data, m_pYUVFrame->linesize);// 將RGB轉化為YUV  
    int myoutputlen = 0;
    int returnvalue = avcodec_encode_video2(c, &pkt, m_pYUVFrame, &myoutputlen);
    if (returnvalue == 0)
    {
        fwrite(pkt.data, 1, pkt.size, file);
    }
    av_free_packet(&pkt);
}

void MyEncoder::Ffmpeg_Encoder_Close()
{
    delete[]m_pRGBFrame;
    delete[]m_pYUVFrame;
    delete[]rgb_buff;
    delete[]yuv_buff;
    delete[]outbuf;
    sws_freeContext(scxt);
    avcodec_close(c);//關閉編碼器  
    av_free(c);
}

main.cpp

#include "opencv2/opencv.hpp"
#include "MyEncoder.h"
using namespace cv;

int main()
{
    cv::VideoCapture capture(0); // 開啟攝像頭
    cv::Mat imageTemp;
    capture >> imageTemp;

    MyEncoder myencoder;
    myencoder.Ffmpeg_Encoder_Init();//初始化編碼器  
    myencoder.Ffmpeg_Encoder_Setpara(AV_CODEC_ID_H264, imageTemp.cols, imageTemp.rows);//設定編碼器引數  
                                                             //圖象編碼  
    FILE *f = NULL;
    char * filename = "myData.h264";
    fopen_s(&f, filename, "wb");//開啟檔案儲存編碼完成資料  

    for (int i = 0; i < 500; i ++)
    {
        capture >> imageTemp;
        myencoder.Ffmpeg_Encoder_Encode(f, (uchar*)imageTemp.data);//編碼  
        imshow("send", imageTemp);
        cv::waitKey(30);
    }
    return 0;
}

相關推薦

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

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

ffmpeg linux下命令列將h264檔案轉換成MP4格式

 先交叉編譯./configure --disable-yasm --enable-gpl --enable-nonfree --prefix=/ud/build/lq_work/arm_ffmpeg211 --enable-cross-compile --cross-pre

Live555 實時接收RTSP碼流儲存H264檔案

一、openRTSP 執行 ./openRTSP -f 25 -w 1280 -h 720 "rtsp://192.168.1.139:8554/stream_chn0.264"   二、testRTSpClient  修改testRTSpClient.cpp

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

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

FFmpeg解碼MP4檔案h264和YUV檔案

#include <iostream> #ifdef __cplusplus extern "C" { #endif #include <libavcodec/avcodec.h> #include <libavformat/avformat.h> #in

android平臺下基於ffmpeg對相機採集的NV21資料編碼MP4視訊檔案

音視訊實踐學習 android全平臺編譯ffmpeg以及x264與fdk-aac實踐 ubuntu下使用nginx和nginx-rtmp-module配置直播推流伺服器 android全平臺編譯ffmpeg合併為單個庫實踐 android-studio使用c

libjpeg庫編碼圖片jpg(ffmpeg解碼視訊儲存圖片:RGB格式點陣圖壓縮jpg格式圖片)

壓縮流程(結合網上大家的資料以及libjpeg庫的example.c示例:都大同小異): 1、如何分配和初始化一個jpeg壓縮物件:      在libjpeg中jpeg壓縮物件被定義為struct

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

[iOS]圖片壓縮&儲存View內容Img

1、圖片的壓縮 封裝類方法 + (UIImage*)imageWithImageSimple:(UIImage*)image scaledToSize:(CGSize)newSize { // Create a graphics image context UIGraph

Java-Spring框架實現簡單的檔案上傳(圖片例)

一、開發環境搭建 下載相應的jar包: 1.commons-fileupload    2.commons-io web.xml 檔案配置: <servlet>       &

上機考試系統 commons-fileupload 上傳與下載 && 壓縮 zip 檔案 && 刪除資料夾下所有內容

在 maven 中使用了 commons-fileupload,使用方法: (一)上傳 1-1.前端介面 <form action="" enctype="multipart/form-data" class="modifyall" method="post

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

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

批量的圖片儲存mat檔案 -- MATLAB

matlab實現批量圖片向mat轉換,對應大量資料集圖片處理異常重要 clc; clear all; num = 1000; %圖片數量 for i = 1 : num    IMAGE = imread(sprintf('G:\\TEST\\%.jpg'

ffmpeg 實現RTSP/RTMP 從伺服器拉音視訊流,儲存h264和AAC

int my_av_bsf_filter(const AVBitStreamFilter *filter, AVPacket *pPacket, const AVCodecParameters *src) { int ret; AVBSFContext *ctx = NULL; if (!fi

利用HTML5上傳檔案並顯示在前端預覽,以圖片

由於專案中有上傳檔案的功能,所以這次單獨拿出來研究研究,我上網查了查,以前都是用iframe,但是自從HTML5出世之後,就可以利用H5的一些特性來上傳檔案了,啥也不說了,我上程式碼了 <!DOCTYPE html> <html lang

下載,更新及刪除檔案(以圖片例)

一、下載檔案 public void downloaddownfiles(HttpServletResponse response, String filepath) { try { File file = new File(filepath);//filepath為

遍歷資料夾中的檔案(以圖片例)

需求:前臺頁面的圖片從伺服器中動態提取 思路:1.遍歷該圖片資料夾      2.將所有圖片名稱以List集合傳入前端頁面      3.前端遍歷,根據名稱讀取圖片 工具:ajax 方法:$.each(json,fu

前端JS轉圖片base64並壓縮、調整尺寸指令碼

image to base64 to blob //////////////////////////////////////////////////////////////////////////////////////////////// // 名稱: base64圖片轉二進位制檔

FFMpeg視訊開發與應用基礎】五、呼叫FFMpeg SDK封裝音訊和視訊視訊檔案

《FFMpeg視訊開發與應用基礎——使用FFMpeg工具與SDK》視訊教程已經在“CSDN學院”上線,視訊中包含了從0開始逐行程式碼實現FFMpeg視訊開發的過程,歡迎觀看!連結地址:FFMpeg視訊開發與應用基礎——使用FFMpeg工具與SDK