ffmpeg解码h264流数据并用opencv显示

利用ffmpeg和opencv进行视频的解码播放 引子OpenCV中有自己的用于处理图片和视频的类VideoCapture,可以很方便的读入文件和显示。现在视频数据流是ffmpeg解码h264文件得到的,由于要依赖该数据源进行相应的后续处理,所以需要将ffmpeg中得到的数据缓存转换成可以被OpenCV处理的Mat类对象。ffmpeg介绍FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证(依据你选择的组件)。它提供了录制、转换以及流化音视频的完整解决方案。 阅读详情

    最近做的一个项目,需要播放服务端传过来的h264裸流数据,于是做了一个简易的播放器,采用ffmpeg解码h264并用opencv显示图像。实现原理很简单,首先接收到一个完整的h264帧之后传给ffmpeg的AVPacket,然后调用avcodec_send_packet()和avcodec_receive_frame()解码,得到一个AVFrame,然后调用sws_scale()把解码后的yuv图像转换成opencv能使用的RGB图像,然后每解码转换一帧数据就调用一次cv::imshow()显示图像,具体实现代码如下:

//H264ToCVShow.h
#ifndef _H264TOCVSHOW_H
#define _H264TOCVSHOW_H

//#define __STDC_CONSTANT_MACROS
#include <stdio.h>
// Opencv
extern "C" {
#include "libavutil/avutil.h"
#include "libavcodec/avcodec.h"
#include "libavformat/avformat.h"
#include "libswscale/swscale.h"
#include "libavutil/imgutils.h"
};
#include <opencv2/opencv.hpp>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/objdetect.hpp>

#include <thread>
#include <string>

class H264ToCVShow {

public :

    H264ToCVShow(std::string winName);
    ~H264ToCVShow(); 
    void init();
    void decode(unsigned char *inputbuf, size_t size);
    void start();
    void play();
    cv::Mat getMat();

private:
    
    const AVCodec *codec;
    AVCodecContext *c = nullptr;
    int frame_count;
    AVFrame *frame;
    AVPacket avpkt;
    struct SwsContext *img_convert_ctx;
    cv::Mat pCvMat;
    bool matReady;
    std::thread *play_th = nullptr;
    std::string windowName;
};

#endif 
//H264ToCVShow.cpp
#include "H264ToCVShow.h"
#pragma comment(lib,"avformat.lib")
#pragma comment(lib,"avutil.lib")
#pragma comment(lib,"avcodec.lib")
#pragma comment(lib,"swscale.lib")
#pragma comment(lib,"opencv_world320d.lib")


void H264ToCVShow::init() {

    matReady = false;
    av_init_packet(&avpkt);

    codec = avcodec_find_decoder(AV_CODEC_ID_H264);
    if (!codec) {
        fprintf(stderr, "Codec not found\n");
        exit(1);
    }
    c = avcodec_alloc_context3(codec);
    if (!c) {
        fprintf(stderr, "Could not allocate video codec context\n");
        exit(1);
    }

    if (avcodec_open2(c, codec, NULL) < 0) {
        fprintf(stderr, "Could not open codec\n");
        exit(1);
    }

    frame = av_frame_alloc();
    if (!frame) {
        fprintf(stderr, "Could not allocate video frame\n");
        exit(1);
    }

    frame_count = 0;

}


void H264ToCVShow::decode(unsigned char *inputbuf, size_t size){

    avpkt.size = size;
    if(avpkt.size == 0)
        return;

    avpkt.data = inputbuf;
	int ret = avcodec_send_packet(c, &avpkt);
	if (ret != 0)
	{
		printf("avcodec_send_packet error\n");
	}
	ret = avcodec_receive_frame(c, frame);
	while (true)
	{
		if (ret == 0)
		{
			int width = frame->width;
			int height = frame->height;

			// Allocate the opencv mat and store its stride in a 1-element array
			if (pCvMat.rows != height || pCvMat.cols != width || pCvMat.type() != CV_8UC3) pCvMat = cv::Mat(height, width, CV_8UC3);
			int cvLinesizes[1];
			cvLinesizes[0] = pCvMat.step1();

			// Convert the colour format and write directly to the opencv matrix
			SwsContext* conversion = sws_getContext(width, height, (AVPixelFormat)frame->format, width, height, AVPixelFormat::AV_PIX_FMT_BGR24, SWS_FAST_BILINEAR, NULL, NULL, NULL);
			sws_scale(conversion, frame->data, frame->linesize, 0, height, &pCvMat.data, cvLinesizes);
			sws_freeContext(conversion);
			matReady = true;
			ret = avcodec_receive_frame(c, frame);
			if (ret != 0) {
				matReady = false;
				break;
			}
		}
		else {
			matReady = false;
			break;
		}
	}
}

void H264ToCVShow::play() {
    while(true)
    {
        if(matReady){   
            cv::imshow(windowName,pCvMat);
            cv::waitKey(1);
        }
    }
}

void H264ToCVShow::start()
{
    play_th = new std::thread(&H264ToCVShow::play,this);
    //play_th->join();
}

H264ToCVShow::H264ToCVShow(std::string winName) {
    this->windowName = winName;
    init();
}
H264ToCVShow::~H264ToCVShow() {
    play_th->join();
    delete play_th;
    play_th = nullptr;
}
cv::Mat H264ToCVShow::getMat() {
    if(matReady){
        return pCvMat;
    }
    else{
        return cv::Mat();
    }
}



opencv使用h264_omx进行ffmpeg编码的问题 使用opencv打开摄像头,对每一帧画面进行图像处理,之后使用ffmpeg进行H264编码,最后保存/发送编码数据。 使用opnecv图像处理后能够获取编码为 rgb24 和yuv420p 的 cv::Mat 图像数据,ffmpeg的H264 encoder可以选诸如libx264、h264_omx等编码器。 首先给出一个基本的测试流程代码,如下。 1、Windows测试libx264编码 在winodws下使用libx264编码器,要求输入为yuv420p图像数据。 代码中函数RaspiEncode_In 阅读详情

相关推荐

FFmpeg实时解码H264

    ffmpeg的解码过程在前面已经稍微总结了下,这里主要是测试一下用ffmpeg如何进行实时的解码。    在解码之前,我们先做好准备工作,调用摄像头。编码的过程中,进行入队出队操作,出队后的数据交给解码器,进行解码。    接下来依次介绍各个模块。1.调用摄像头:VideoCapture capture(0); int w = capture.get(CV_CAP_PROP_FRAME_...

为取经而来的博客 3万+

讲解python opencv图片编码为h264文件

请注意,本篇文章只是提供了一个简单的示例代码和解释来演示使用OpenCV编码图像为H.264文件的过程。在实际应用中,你可能需要进行更多的设置和优化,以满足你的具体需求。请注意,这只是一个简单的示例代码,实际应用中可能还需要添加其他设置和优化,以达到更好的编码效果和性能。在计算机视觉和图像处理应用中,使用适当的编码格式对图像进行压缩和存储是至关重要的。H.264是一种广泛使用的视频压缩编码标准,可以将图像序列编码为高质量、低比特率的视频文件。接下来,我们需要创建一个编码器对象,使用H.264编码图像序列。

牛肉胡辣汤 2405

ffmpeg 解码h264数据

本文内容均为原创,转载请注明出处。 使用ffmpeg解码h264数据其实相对使用x264进行视频编码是简单了许多的,因为ffmpeg提供了一个decoding_encoding.c的文件,这个文件里面有简单的使用ffmpeg进行视频、音频编解码的例子,不过可能有的人也会找不到这个示例,我就讲我改造过的这个示例放在这里,同时加一些解释。 其中需要注意的的一点我需要在此说明,就是ffmpeg在

一个健忘症患者的记忆备份 1万+

opencv h264压缩视频

Opencv FFmpeg H264 H265 视频编码 多进程

zhibing_ding的博客 8059

CUDA和FFMPEG硬件解码视频流

其他博客给出的教程要么只是给出了伪代码,非常的模糊,要么是基于D3D进行显示,使得给出的源码非常复杂,而无法看出CUDA解码的核心框架,而本文将其他非核心部分剥离出去,视频播放部分通过opencv调用cv::mat显示。示例中NvDecodeD3D9.cpp实现了D3D环境的创建,CUDA模块的初始化,其中取视频帧图像显示的函数如下,该函数实现了从解码图像队列取出图像(实际上是显存指针),完成格式转换(NV12到ARGB),最后映射到D3D的Texture进行显示等功能,代码中我给出了关键部位的解释。

yinshipin007的博客 2165

FFmpeg读取远程摄像头视频并用opencv显示

首先要配置好FFmpeg和opencv环境,ffpmeg可以直接读取tcp视频流数据,只需将设置好ip地址和端口即可直接打开这个数据流。然后设置好解码器,//配置静态库,也可直接添加到附加依赖项中#pragma comment(lib, "legacy_stdio_definitions.lib") #pragma comment(lib, "avcodec.lib")   #pragma com...

漫时光,慢慢 2386

x264及H264实现对OpenCV Mat的编解码

x264及H264实现对OpenCV Mat的编解码 微信公众号:幼儿园的学霸 个人的学习笔记,关于OpenCV,关于机器学习, …。问题或建议,请公众号留言; 之前写的ADAS客户端软件和ADAS程序之间的视频传输采用了cv::imencode和cv::imdecode函数实现编解码,最近偶然间发现可以利用H.264对视频进行编解码,并且效果还不错,特此记录。 目录 文章目录x264及H26...

leonardohaig的博客 7923

ffmpeg+opencv播放器

http://www.tuicool.com/articles/z6RFbu 引子 OpenCV中有自己的用于处理图片和视频的类 VideoCapture ,可以很方便的读入文件和显示。 现在视频数据流是ffmpeg解码h264文件得到的,由于要依赖该数据源进行相应的后续处理,所以需要将ffmpeg中得到的数据缓存转换成可以被OpenCV处理的Mat类对象。

jbl19860422的博客 1736

ffmpeg解码+opencv显示

ffmpeg 解码h264,并OPENCV显示  (2013-12-18 10:31:01) 转载▼     #include "stdafx.h" #pragma comment(lib, "avcodec.lib   ") #pragma comment(lib, "avformat.lib  ") #pragma

tkp2014的专栏 1065

FFmpeg解码封装为类以及Opencv显示播放

// 解码函数接口头文件 //#ifndef __FFMPEG_DECODE_H__ //#define __FFMPEG_DECODE_H__ // Opencv #include #include #include #include extern "C" { #include "libavutil/avutil.h" #include "libavcodec/avcodec

tkp2014的专栏 937

利用FFmpge进行视频解码(从H264视频流到图像)

同上面所写的两篇文章,本篇依然是介绍FFmpge的相关操作,前一篇讲的是视频压缩,本篇则相反的讲视频的解码。废话不多说,直接上代码吧。 同理于上篇,本篇先设计一个视频解码相关的类,定义如下: class Ffmpeg_Decoder { public: AVCodecParserContext *avParserContext; AVPacket avpkt; //数...

weixinhum 1万+

ffmpeg和Opencv结合进行视频解码播放

引子 OpenCV中有自己的用于处理图片和视频的类VideoCapture,可以很方便的读入文件和显示。 现在视频数据流是ffmpeg解码h264文件得到的,由于要依赖该数据源进行相应的后续处理,所以需要将ffmpeg中得到的数据缓存转换成可以被OpenCV处理的Mat类对象。 ffmpeg介绍 FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可

tkp2014的专栏 2491

基于集成运放心电放大器设计(原创)

原创作者:einyboy or alert 最近在看美剧《危机边缘》关于边缘科学的案件,科技控可以看一下,但建议不在吃东西的时候看。想像力是创造的思想源头,动手能力则是创造的车床。 自认为是没有想像力的那类,只能发挥动手能力了。 心电测量简介 图1 心电极接线图 如图1心电测试一般使用3个心电极进行测量,各个电极的说明如下: RA: Right Arm缩写,右手电极 LA: L...

huandaohack的专栏 6924

OPENCV+FFMPEG播放器

引子 OpenCV中有自己的用于处理图片和视频的类 VideoCapture ,可以很方便的读入文件和显示。 现在视频数据流是ffmpeg解码h264文件得到的,由于要依赖该数据源进行相应的后续处理,所以需要将ffmpeg中得到的数据缓存转换成可以被OpenCV处理的Mat类对象。 ffmpeg介绍 FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,

jbl19860422的博客 4077

相控阵多功能雷达工作模式识别技术综述

本文综述了相控阵雷达工作模式识别技术的研究进展。首先介绍了相控阵雷达的典型工作模式分类及其信号特征参数,包括搜索模式(VS、RWS、TWS)、跟踪模式(STT、MTT、TAS)和其他模式(SAM、SAR)等。随后重点阐述了基于信号特征的识别方法,包括时域特征(PRI分析、脉冲幅度包络、数据率)、频域特征(载频变化、调制方式)和混合特征分析方法。最后讨论了当前技术面临的挑战与发展趋势,包括复杂信号环境下的识别难题、新型雷达技术的适应需求以及深度学习技术的应用前景。该领域的研究对电子侦察和威胁评估具有重要意义。

Grow into a more wonderful you 1807

Sentence-BERT 语义相似度双塔模型

论文介绍 发表:2019,EMNLP 论文题目:《Sentence-BERT:sentence embeddings using siaese BERT-networks》 论文地址:https://arxiv.org/abs/1908.10084 Github:https://github.com/UKPLab/sentence-transformers 适用领域: 句向量生成 语义相似度计算 语义搜索 无监督任务(聚类) 1 概述 在20年之前的各种预训练模型中,比如bert,XLNet,Alb

weiyaner的博客 9193

基于ffmpeg+opencv的h264解码显示功能的实现

最近做的一个项目中需要对h264编码的视频文件进行解码并转换为openc可以处理的格式进行显示和相关的图像处理操作。从网上找了借鉴了很多资料,但做的相对来说比较简单。因此,在网上现有的代码基础上进行了整理和优化。目前在项目中集成,效果良好。特分享给有共同需求的朋友,如有可继续优化的空间,还望各位朋友能指出,我们共同学习与提高。 下面,贴出相关代码。 decode_video.h #ifnde...

Ant 7770

统一大型语言模型和知识图谱:路线图

大型语言模型(LLM),如ChatGPT和GPT4,由于其涌现能力和泛化性,正在自然语言处理和人工智能领域掀起新的浪潮。然而,LLM是黑箱模型,通常无法捕捉和获取事实知识。相反,知识图谱(KGs),例如维基百科和华普,是显式存储丰富事实知识的结构化知识模型。KGs可以通过为推理和可解释性提供外部知识来增强LLM。同时,KGs很难从本质上构建和演化,这对KGs中现有的生成新事实和表示未知知识的方法提出了挑战。因此,将LLM和KGs统一在一起并同时利用它们的优势是相辅相成的。

qq_32907491的博客 2842

Java利用JNI调用FFMpeg对h264码流进行解码

前期配置工作:在Visual Studio端配置FFMpeg在Visual Studio端配置OpenCV解码部分主要源代码及说明解码部分vs工程下载地址使用JNI调用:java端:package com.recon.action; public class Decode { public native String loadfile(String s); //传递字符串告知c++工程所要打开的h

Breadcrumb Trails 4964

基于MATLAB编程的LSTM的时间序列预测

时间序列预测,回归分析,LSTM详细原理

abc991835105的博客 360

用 MVC 框架把 ABAP 报表写成可扩展的应用(2)

本文介绍了一个基于MVC架构的SAP报表模板,解决了传统ABAP报表开发中的三个核心痛点: 选择屏幕校验逻辑分散问题 - 通过统一的选择屏幕控制器集中管理校验逻辑 在线与后台输出不一致问题 - 共享同一数据模型,通过不同控制器实现多样化展示 屏幕流转管理混乱问题 - 主控制器统一管理所有屏幕流程和事件 该模板采用分层架构: Model层专注数据获取和业务规则 Controller层管理流程和交互 View层负责展示逻辑 特别适用于需要同时支持交互式ALV展示和后台批处理输出的报表场景,通过标准化的扩展点设计

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 78
上一篇: 海康、国标PS流数据解析
惊群
博客等级 码龄16年 12粉丝 5原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值