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