ffmpeg视频解码原理和实战-(2)对avpacket中的数据进行解码并防止丢帧

embedded/2024/9/24 21:21:14/

源文件:

#include <iostream>
#include <fstream>
using namespace std;
extern "C" { //指定函数是c语言函数,函数名不包含重载标注
//引用ffmpeg头文件
#include <libavcodec/avcodec.h>
}
//预处理指令导入库
#pragma comment(lib,"avcodec.lib")
#pragma comment(lib,"avutil.lib")
int main(int argc, char* argv[])
{//1 分割h264 存入AVPacket// ffmpeg -i v1080.mp4 -s 400x300 test.h264string filename = "test.h264";ifstream ifs(filename, ios::binary);if (!ifs)return -1;unsigned char inbuf[4096] = { 0 };//用于存储h264编码流AVCodecID codec_id = AV_CODEC_ID_H264;//1 找解码器auto codec = avcodec_find_decoder(codec_id);//2 创建解码器上下文auto c = avcodec_alloc_context3(codec);//3 打开上下文avcodec_open2(c, NULL, NULL);//分割上下文auto parser = av_parser_init(codec_id);auto pkt = av_packet_alloc();auto frame = av_frame_alloc();while (!ifs.eof()){ifs.read((char*)inbuf, sizeof(inbuf));//将h264编码的流读入inbuf中,一次读4096int data_size = ifs.gcount();// 读取的字节数,inbuf中的字节数if (data_size <= 0)break;auto data = inbuf;while (data_size > 0) //一次有多帧数据{//通过0001 截断输出到AVPacket 返回帧大小int ret = av_parser_parse2(parser, c,&pkt->data, &pkt->size, //截断后输出到AVpacket的data中data, data_size,        //h264编码流,待处理数据AV_NOPTS_VALUE, AV_NOPTS_VALUE, 0);//返回消耗的输入数据字节数ret。如果所有输入数据都被消耗,则返回值等于 buf_size。如果解析过程中出现错误,则返回负数。data += ret;//data指针向前移动 ret个字节,继续处理inbuf未处理的数据data_size -= ret; //待处理的数据大小if (pkt->size){//cout << pkt->size << " "<<flush;//发送packet到解码线程ret = avcodec_send_packet(c, pkt);//把avpacket给解码器进行解码if (ret < 0)break;//获取多帧解码数据while (ret >= 0){//每次回调用av_frame_unref ret = avcodec_receive_frame(c, frame);//拿到解码后的数据if (ret < 0)break;cout << frame->format << " " << flush;}}}}///取出缓存数据,防止丢帧int ret = avcodec_send_packet(c, NULL);while (ret >= 0){ret = avcodec_receive_frame(c, frame);if (ret < 0)break;cout << frame->format << "-" << flush;}av_parser_close(parser);avcodec_free_context(&c);av_frame_free(&frame);av_packet_free(&pkt);getchar();return 0;
}


http://www.ppmy.cn/embedded/46974.html

相关文章

基于SpringBoot二手图书管理系统

摘 要 本毕业论文设计并实现了一款基于 Spring Boot 的二手图书管理系统。该系统旨在解决传统图书管理系统存在的一系列问题&#xff0c;如用户体验不佳、功能单一等。首先&#xff0c;论文详细分析了当前二手图书市场的需求和存在的问题&#xff0c;明确了设计该系统的必要性…

k8s——安全机制

一、安全机制说明 Kubernetes作为一个分布式集群的管理工具&#xff0c;保证集群的安全性是其一个重要的任务。API Server是集群内部各个组件通信的中介&#xff0c; 也是外部控制的入口。所以Kubernetes的安全机制基本就是围绕保护API Server来设计的。 比如 kubectl 如果想…

Klipper安装

安装必要软件 Klipper相关的软件需要Python等软件才能运行&#xff0c;且需要git来同步最新的Klipper等软件源代码&#xff0c;所以需要使用sudo apt install build-essential python3 python3-pip git来安装必要的软件。 安装好pip后&#xff0c;运行pip config set global.i…

0104__Linux 中 nm 命令简介

Linux 中 nm 命令简介_linux nm-CSDN博客

Vue03-HelloWord

一、Hello World 1-1、示例1 1、现有html容器&#xff1b; 2、再有vue实例。 new Vue({});中的{}是配置对象。配置对象是&#xff1a;key&#xff1a;value的格式。 el&#xff1a;element元素。id对应#&#xff0c;class对应. 把容器中变化的数据&#xff0c;交给Vue实例去保…

Python GUI 库跨平台兼容问题及解决方案

在选择 Python GUI 库时&#xff0c;跨平台兼容性是一个重要的考虑因素。不同的 GUI 库可能在不同的操作系统上表现不同&#xff0c;因此需要选择一个能够在多个平台上运行良好的库。如果我们遇到下面的问题&#xff0c;可以尝试下我整理的方法。 1、问题背景 Python 作为一门…

实验五、IPv4地址的子网划分,第1部分《计算机网络》

但凡你有点本事&#xff0c;也不至于一点本事都没有。 目录 一、实验目的 二、实验内容 三、实验小结 一、实验目的 完成本练习之后&#xff0c;您应该能够确定给定 IP 地址和网络掩码 的网络信息。本练习旨在让您掌握如何根据给定 IP 地址计算网络 IP 地址信息。 二、实验…

Flutter生活服务类APP常用的第三方库总汇

Flutter生活服务类APP常用的第三方库总汇 生活服务类APP在日常生活中扮演着越来越重要的角色&#xff0c;从外卖、家政、美容到汽车服务等&#xff0c;几乎涵盖了生活的方方面面。Flutter作为一个高效的跨平台移动应用开发框架&#xff0c;为这类应用的开发提供了强大的支持。…