解码AVC(h264)裸流为yuv420P写入文件

使用AVC裸流解析器解析AVC裸流文件,然后解码为yuv420P格式写入文件

// 解码h264
#include "myLog.h"
#include <iostream>extern "C"
{
#include "libavcodec\avcodec.h"
}#define VIDEO_INBUF_SIZE 20480		// 最初读取数据大小
#define VIDEO_REFILL_THRESH 4096static char* av_get_err(int errnum)
{char err_buf[128] = { 0 };av_strerror(errnum, err_buf, 128);return err_buf;
}static void print_video_format(const AVFrame *frame)
{printf("width: %u\n", frame->width);printf("height: %u\n", frame->height);printf("format: %u\n", frame->format);
}static void decode_video(AVCodecContext* dec_ctx, AVPacket* pkt, AVFrame* frame, FILE* out_fp)
{int nRet = avcodec_send_packet(dec_ctx, pkt);if (nRet == AVERROR(EAGAIN)){LOG_WARNING("need more pkt\n");return;}else if (nRet < 0){LOG_WARNING("Error submitting the packet to the decoder, err:%s, pkt_size:%d\n",av_get_err(nRet), pkt->size);return;}// 一个pkt可能会有多个framewhile (nRet >= 0){nRet = avcodec_receive_frame(dec_ctx, frame);if (nRet == AVERROR(EAGAIN) || nRet == AVERROR_EOF){return;}else if (nRet < 0){LOG_WARNING("Error during decoding\n");return;}// 打印一次信息static bool is_print = false;if (!is_print){is_print = !is_print;print_video_format(frame);}// 一般H264默认为 AV_PIX_FMT_YUV420P// linesize[i]代表每行的字节数量,所以每行的偏移是linesize[i]// 写入YUV420P格式数据(每次写入一行数据)for (int i = 0; i < frame->height; i++)	// Y{fwrite(frame->data[0] + i * frame->linesize[0], 1, frame->width, out_fp);}for (int i = 0; i < frame->height / 2; i++)	// U{fwrite(frame->data[1] + i * frame->linesize[1], 1, frame->width / 2, out_fp);}for (int i = 0; i < frame->height / 2; i++)	// V{fwrite(frame->data[2] + i * frame->linesize[2], 1, frame->width / 2, out_fp);}}
}// ffplay  -f rawvideo -pixel_format yuv420p -video_size 852x480 -i HTA_10s_420P.yuv
int main_video_decodec()
{const char* in_file = "./HTA_10s.h264";const char* out_file = "./HTA_10s_420P.yuv";// 1. 直接查找h264解码器AVCodec* video_dec = avcodec_find_decoder(AV_CODEC_ID_H264);if (video_dec == nullptr){LOG_WARNING("avcodec_find_decoder error\n");return -1;}// 2. 创建解码器上下文AVCodecContext* dec_ctx = avcodec_alloc_context3(video_dec);if (dec_ctx == nullptr){LOG_WARNING("avcodec_alloc_context3 error\n");return -2;}// 3. 初始化(h264)裸流解析器AVCodecParserContext* parser_ctx = av_parser_init(dec_ctx->codec_id);if (parser_ctx == nullptr){LOG_WARNING("av_parser_init error\n");return -3;}// 4. 将解码器与上下文关联int nRet = avcodec_open2(dec_ctx, video_dec, NULL);if (nRet < 0){LOG_WARNING("avcodec_open2 error\n");return -4;}// 5. 打开输入输出文件FILE* in_fp = fopen(in_file, "rb");if (nullptr == in_fp){LOG_WARNING("open in_file error\n");return -5;}FILE* out_fp = fopen(out_file, "wb");if (nullptr == out_fp){LOG_WARNING("open out_file error\n");return -6;}// 读取文件开始解码uint8_t inbuf[VIDEO_INBUF_SIZE + AV_INPUT_BUFFER_PADDING_SIZE];uint8_t *data = inbuf;size_t   data_size = 0;data_size = fread(inbuf, 1, VIDEO_INBUF_SIZE, in_fp);AVPacket* pkt = av_packet_alloc();AVFrame* frame = av_frame_alloc();while (data_size > 0){if (frame == nullptr){LOG_WARNING("frame is nullptr\n");return -7;}nRet = av_parser_parse2(parser_ctx, dec_ctx, &pkt->data, &pkt->size,data, data_size, AV_NOPTS_VALUE, AV_NOPTS_VALUE, 0);if (nRet < 0){LOG_WARNING("av_parser_parse2 error\n");return -8;}data += nRet;data_size -= nRet;if (pkt->size){// 解码decode_video(dec_ctx, pkt, frame, out_fp);}if (data_size < VIDEO_REFILL_THRESH){memmove(inbuf, data, data_size);data = inbuf;int len = fread(inbuf + data_size, 1, VIDEO_INBUF_SIZE - data_size, in_fp);if (len > 0){data_size += len;}}}// 冲刷解码器pkt->data = NULL;pkt->size = 0;decode_video(dec_ctx, pkt, frame, out_fp);// 释放资源fclose(in_fp);fclose(out_fp);avcodec_free_context(&dec_ctx);av_parser_close(parser_ctx);av_frame_free(&frame);av_packet_free(&pkt);getchar();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/802334.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

redis 集群模式(redis cluster)介绍

目录 一 redis cluster 相关定义 1&#xff0c; redis cluster 是什么 2&#xff0c;redis 集群的组成 3&#xff0c;集群的作用 4&#xff0c;集群架构图 二 Redis集群的数据分片 1&#xff0c;哈希槽是什么 2&#xff0c;哈希槽如何排布 3&#xff0c;Redis集…

UVA1592 DataBase 解题报告

UVA1592 DataBase 解题报告 题目链接 https://vjudge.net/problem/UVA-1592 题目大意 输入一个n行m列的数据库&#xff08;1≤n≤10000&#xff0c;1≤i≤10&#xff09;&#xff0c;是否存在两个不同行r1&#xff0c;r2和两个不同列c1&#xff0c;c2&#xff0c;使得这两行…

五边形信息图表绘制方法

五边形信息图表绘制方法 在网络科技发展进步的当下&#xff0c;原来一些传统的统计图表都有了进一步的创新。以前企业的PPT都依赖微软的各应用软件来制作图表&#xff0c;现时企业的PPT展示的图表应用不再满足于原来的图表绘制方法&#xff0c;进而使用一些第三方应用软件来制作…

Linux_进程的优先级环境变量上下文切换优先级队列

文章目录 一、进程的优先级二、进程的四个重要概念三、上下文切换四、环境变量查看当前shell环境下的环境变量与内容 五、Linux2.6内核进程调度队列一个CPU拥有一个runqueue优先级活动队列过期队列active指针和expired指针 一、进程的优先级 什么是优先级&#xff1f; 指定一个…

如何使用宝塔面板搭建MySQL数据库并实现无公网IP远程访问

文章目录 前言1.Mysql服务安装2.创建数据库3.安装cpolar3.2 创建HTTP隧道 4.远程连接5.固定TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址 前言 宝塔面板的简易操作性,使得运维难度降低,简化了Linux命令行进行繁琐的配置,下面简单几步,通过宝塔面板cp…

免费-华为od-C卷-javascript-动态规划-贪心歌手.js

动态规划-贪心歌手 还有很多其他题&#xff0c;链接是github, 进去可以查看对应文件夹就行

rhce复习3

DNS DNS&#xff08;Domain Name System&#xff09;是互联网上的一项服务&#xff0c;它作为将域名和IP地址相互映射的一个分布式数据库&#xff0c;能够使人更方便的访问互联网。 DNS系统使用的是网络的查询&#xff0c;那么自然需要有监听的port。DNS使用的是53端口&#x…

本地MinIO存储服务通过Java程序结合cpolar实现远程连接上传文件

文章目录 前言1. 创建Buckets和Access Keys2. Linux 安装Cpolar3. 创建连接MinIO服务公网地址4. 远程调用MinIO服务小结5. 固定连接TCP公网地址6. 固定地址连接测试 前言 MinIO是一款高性能、分布式的对象存储系统&#xff0c;它可以100%的运行在标准硬件上&#xff0c;即X86等…

HarmonyOS 应用开发-使用colorPicker实现背景跟随主题颜色转换

介绍 本示例介绍使用image库以及effectKit库中的colorPicker对目标图片进行取色&#xff0c;将获取的颜色作为背景渐变色&#xff0c;通过swiper组件对图片进行轮播&#xff0c; 效果图预览 使用说明 直接进入页面&#xff0c;对图片进行左右滑动&#xff0c;或者等待几秒&a…

谷粒商城学习日志

谷粒商城学习日志 学习计划完成时间备注学习目录大纲 学习计划 每天学习2小节视频课程 完成时间 共407节&#xff0c;预计200天完成 备注 计划根据实际执行情况进行调整&#xff0c;7天为周期一调整 每天学习完成内容更新此大纲 学习目录大纲

对称排序(蓝桥杯)

文章目录 对称排序问题描述模拟 对称排序 问题描述 小蓝是一名软件工程师&#xff0c;他正在研究一种基于交换的排序算法&#xff0c;以提高排序的效率。 给定一个长度为 N 的数组 A&#xff0c;小蓝希望通过交换对称元素的方式对该数组进行排序。 具体来说&#xff0c;小蓝…

C语言 函数——函数原型

目录 如何合并成一个完整的程序&#xff1f; 函数原型与函数定义的区别 函数原型的作用 如何合并成一个完整的程序&#xff1f; 问题&#xff1a;在一个函数中调用另一个函数&#xff0c;需要具备哪些条件呢&#xff1f; 若函数的定义出现在函数调用之前 若函数的定义出现…

转让北京通信工程施工二级资质公司要求和价格

随着通信市场的不断扩大&#xff0c;通信工程企业的发展也越来越快。在通信施工市场中&#xff0c;拥有二级资质的企业才能够更好、更稳定地参与市场竞争&#xff0c;可是资质申请过程较为繁琐&#xff0c;对于很多中小企业而言缺少人力、财力、精力等情况下&#xff0c;其实资…

数据是一维数据,每一条数据对应一个标签,利用tensorflow深度学习框架写一个带自注意力机制的卷积神经网络,并进行预测训练

以下是一个使用 TensorFlow 实现带自注意力机制的卷积神经网络&#xff08;Convolutional Neural Network, CNN&#xff09;进行训练和预测的示例代码&#xff1a; import tensorflow as tf# 定义模型的超参数 learning_rate 0.001 epochs 10 batch_size 32# 构建带自注意力…

网站压力测试和Locust

一、压力测试介绍 网站压力测试是一种评估网站性能、可靠性和稳定性的方法。它通过模拟大量用户同时访问网站,来测试网站的响应时间、吞吐量、资源利用率等指标,从而发现网站的潜在问题和瓶颈。下面我将从几个方面详细介绍网站压力测试: 1、压力测试的目的 评估网站在高并发…

ASTM F2613-19儿童折叠椅和凳子安全标准

ASTM F2613-19折叠椅和凳子安全标准 美国消费品安全委员会&#xff08;CPSC&#xff09;发布的 ASTM F2613-19 儿童折叠椅和凳子的强制性安全标准&#xff0c;已于2020年7月6日生效&#xff0c;并 被纳入联邦法规《16 CFR 1232儿童折叠椅和凳子安全标准》 。 折叠椅和凳子产品示…

用Python编写GUI程序将JPEG文件按文件名顺序插入PDF文件

在Python编程中&#xff0c;处理文件和图像是常见的任务之一。最近&#xff0c;我遇到了一个有趣的问题&#xff1a;如何通过编写一个GUI程序来将一个文件夹中的JPEG文件按文件名顺序插入到一个新的PDF文件中&#xff1f;在这篇博客中&#xff0c;我将分享我使用Python、wxPyth…

DC-DC芯片D1509适用于工控主板、TV板卡、安卓主板、车载功放电源等产品方案应用。

一、应用领域 适用于工控主板、TV板卡、安卓主板、车载功放电源等产品方案应用。 二、功能介绍 D1509是芯谷科技推出的一款输入耐压40V、输出电压1.23-37V可调、输出电流最大2.0A的高效率、高精度DC-DC芯片&#xff0c;其输出电压有固定3.3V、5.0V和12.0V的版本&#xff…

网络安全行业现在还能入吗?

这几年随着我国《国家网络空间安全战略》《网络安全法》《网络安全等级保护2.0》等一系列政策/法规/标准的持续落地&#xff0c;网络安全行业地位、薪资随之水涨船高。 未来3-5年&#xff0c;是安全行业的黄金发展期&#xff0c;提前踏入行业&#xff0c;能享受行业发展红利。…

【ArcPro 加载项】图层组排序子图层

最近做控规&#xff0c;CAD湘源用的比较多。 这里就需要再夸夸Pro3.0&#xff0c;对CAD和湘源的支持非常到位。顺便再鞭尸Pro3.2&#xff0c;规划人千万不要更新。 【ArcGIS 小贴士】Pro3.2逆向更新&#xff0c;不能正常显示CAD、湘源 等等&#xff0c;发现一个问题&#xf…