使用FFmpeg将YUV编码为H.264并封装为MP4,通过api接口实现

YUV数据来源

  • 摄像头直接采集的原始视频流通常为YUV格式(如YUV420),尤其是安防摄像头和网络摄像头
  • 智能手机、平板电脑的摄像头通过硬件接口
  • 视频会议软件(如Zoom、腾讯会议)从摄像头捕获YUV帧,进行预处理(降噪、美颜)后再编码
  • 专业摄像机或采集卡输出的高清视频(如YUV422)用于后期制作,或直播推流前的中间处理
  • 自动驾驶、人脸识别等AI模型常直接处理YUV数据

一、调用流程

初始化FFmpeg
配置编码器参数
创建输出上下文
设置封装格式
循环读取YUV帧
编码与封装
资源释放

二、关键步骤详解

1. 初始化组件
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libavutil/imgutils.h>// 注册所有编解码器和封装格式(新版本可省略)
avformat_network_init();  // 若需网络功能[citation:2][citation:5]
2. 配置编码器参数
// 查找H.264编码器
AVCodec *codec = avcodec_find_encoder(AV_CODEC_ID_H264);
AVCodecContext *codec_ctx = avcodec_alloc_context3(codec);// 设置编码参数
codec_ctx->width = 1280;                   // 分辨率
codec_ctx->height = 720;
codec_ctx->pix_fmt = AV_PIX_FMT_YUV420P;   // 输入YUV格式
codec_ctx->time_base = (AVRational){1, 25}; // 帧率25fps
codec_ctx->bit_rate = 4000000;             // 码率4Mbps
codec_ctx->gop_size = 25;                  // 关键帧间隔[citation:2][citation:6]// 高级参数(可选)
AVDictionary *param = NULL;
av_dict_set(&param, "preset", "slow", 0);  // 编码质量与速度平衡
av_dict_set(&param, "tune", "zerolatency", 0); // 低延迟模式[citation:2]// 打开编码器
avcodec_open2(codec_ctx, codec, &param);
3. 创建MP4封装上下文
AVFormatContext *fmt_ctx = NULL;
avformat_alloc_output_context2(&fmt_ctx, NULL, NULL, "output.mp4");// 添加视频流
AVStream *stream = avformat_new_stream(fmt_ctx, NULL);
avcodec_parameters_from_context(stream->codecpar, codec_ctx);// 打开输出文件
avio_open(&fmt_ctx->pb, "output.mp4", AVIO_FLAG_WRITE);
avformat_write_header(fmt_ctx, NULL);  // 写入文件头[citation:2][citation:5]
4. 处理YUV数据并编码
AVFrame *frame = av_frame_alloc();
frame->width = codec_ctx->width;
frame->height = codec_ctx->height;
frame->format = codec_ctx->pix_fmt;
av_frame_get_buffer(frame, 32);  // 分配帧内存// 读取YUV文件(示例:YUV420P格式)
FILE *yuv_file = fopen("input.yuv", "rb");
int y_size = frame->width * frame->height;while (fread(frame->data[0], 1, y_size * 3/2, yuv_file) > 0) {frame->pts = frame_count++;  // 设置时间戳// 发送帧到编码器avcodec_send_frame(codec_ctx, frame);// 接收编码后的包AVPacket *pkt = av_packet_alloc();while (avcodec_receive_packet(codec_ctx, pkt) == 0) {av_packet_rescale_ts(pkt, codec_ctx->time_base, stream->time_base);av_interleaved_write_frame(fmt_ctx, pkt);  // 写入封装文件av_packet_unref(pkt);}
}
5. 收尾处理
// 冲刷编码器缓冲区
avcodec_send_frame(codec_ctx, NULL);
while (avcodec_receive_packet(codec_ctx, pkt) == 0) {av_interleaved_write_frame(fmt_ctx, pkt);
}// 写入文件尾并释放资源
av_write_trailer(fmt_ctx);
avcodec_free_context(&codec_ctx);
avformat_close_input(&fmt_ctx);

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

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

相关文章

tcpdump工具交叉编译

本文默认系统已经安装了交叉工具链环境。 下载相关版本源码 涉及tcpdump源码&#xff0c;以及tcpdump编译过程依赖的pcap库源码。 网站&#xff1a;http://www.tcpdump.org/release wget http://www.tcpdump.org/release/libpcap-1.8.1.tar.gz wget http://www.tcpdump.org/r…

神经网络中torch.nn的使用

卷积层 通过卷积核&#xff08;滤波器&#xff09;在输入数据上滑动&#xff0c;卷积层能够自动检测和提取局部特征&#xff0c;如边缘、纹理、颜色等。不同的卷积核可以捕捉不同类型的特征。 nn.conv2d() in_channels:输入的通道数&#xff0c;彩色图片一般为3通道 out_c…

在MATLAB中使用GPU加速计算及多GPU配置

文章目录 在MATLAB中使用GPU加速计算及多GPU配置一、基本GPU加速使用1. 检查GPU可用性2. 将数据传输到GPU3. 执行GPU计算 二、多GPU配置与使用1. 选择特定GPU设备2. 并行计算工具箱中的多GPU支持3. 数据并行处理&#xff08;适用于深度学习&#xff09; 三、高级技巧1. 异步计算…

【unitrix】 4.12 通用2D仿射变换矩阵(matrix/types.rs)

一、源码 这段代码定义了一个通用的2D仿射变换矩阵结构&#xff0c;可用于表示二维空间中的各种线性变换。 /// 通用2D仿射变换矩阵&#xff08;元素仅需实现Copy trait&#xff09; /// /// 该矩阵可用于表示二维空间中的任意仿射变换&#xff0c;支持以下应用场景&#xff…

android RecyclerView隐藏整个Item后,该Item还占位留白问题

前言 android RecyclerView隐藏整个Item后,该Item还占位留白问题 思考了利用隐藏和现实来控制item 结果实现不了方案 解决方案 要依据 model 的第三个参数&#xff08;布尔值&#xff09;决定是否保留数据&#xff0c;可以通过 ​filter 高阶函数结合 ​空安全操作符​ 实…

地图瓦片介绍与地图瓦片编程下载

前沿 地图瓦片指将一定范围内的地图按照一定的尺寸和格式&#xff0c;按缩放级别或者比例尺&#xff0c;切成若干行和列的正方形栅格图片&#xff0c;对切片后的正方形栅格图片被形象的称为瓦片[。瓦片通常应用于B/S软件架构下&#xff0c;浏览器从服务器获取地图数据&#xf…

手机屏亮点缺陷修复及相关液晶线路激光修复原理

摘要 手机屏亮点缺陷严重影响显示品质&#xff0c;液晶线路短路、电压异常是导致亮点的关键因素。激光修复技术凭借高能量密度与精准操控性&#xff0c;可有效修复液晶线路故障&#xff0c;消除亮点缺陷。本文分析亮点缺陷成因&#xff0c;深入探究液晶线路激光修复原理、工艺…

MySQL数据一键同步至ClickHouse数据库

随着数据量的爆炸式增长和业务场景的多样化&#xff0c;传统数据库系统如MySQL虽然稳定可靠&#xff0c;但在海量数据分析场景下逐渐显露出性能瓶颈。这时&#xff0c;ClickHouse凭借其列式存储架构和卓越的OLAP&#xff08;在线分析处理&#xff09;能力脱颖而出&#xff0c;成…

Android中Compose常用组件以及布局使用方法

一、基础控件详解 1. Text - 文本控件 Text(text "Hello Compose", // 必填&#xff0c;显示文本color Color.Blue, // 文字颜色fontSize 24.sp, // 字体大小&#xff08;注意使用.sp单位&#xff09;fontStyle FontStyle.Italic, // 字体样式&…

SCI一区黑翅鸢优化算法+三模型光伏功率预测对比!BKA-CNN-GRU、CNN-GRU、GRU三模型多变量时间序列预测

SCI一区黑翅鸢优化算法三模型光伏功率预测对比&#xff01;BKA-CNN-GRU、CNN-GRU、GRU三模型多变量时间序列预测 目录 SCI一区黑翅鸢优化算法三模型光伏功率预测对比&#xff01;BKA-CNN-GRU、CNN-GRU、GRU三模型多变量时间序列预测效果一览基本介绍程序设计参考资料 效果一览 …

创客匠人视角:创始人 IP 打造为何成为知识变现的核心竞争力

在互联网流量成本高企的当下&#xff0c;知识变现行业正经历从 “产品竞争” 到 “IP 竞争” 的范式迁移。创客匠人 CEO 老蒋指出&#xff0c;创始人 IP 已成为企业突破增长瓶颈的关键支点 —— 美特斯邦威创始人周成建首次直播即创下 1500 万元成交额&#xff0c;印证了创始人…

类图+案例+代码详解:软件设计模式----生成器模式(建造者模式)

生成器模式&#xff08;建造者模式&#xff09; 把复杂对象的建造过程和表示分离&#xff0c;让同样的建造过程可以创建不同的表示。 假设你去快餐店买汉堡&#xff0c;汉堡由面包、肉饼、蔬菜、酱料等部分组成。 建造者模式的角色类比&#xff1a; 产品&#xff08;Product…

UI前端与数字孪生融合探索:为智慧物流提供可视化解决方案

hello宝子们...我们是艾斯视觉擅长ui设计、前端开发、数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩! 在全球供应链数字化转型的浪潮中&#xff0c;智慧物流正从概念走向落地 —— 据 MarketsandMa…

远程办公与协作新趋势:从远程桌面、VDI到边缘计算,打造高效、安全的混合办公环境

一、引言 随着数字化转型的加速&#xff0c;越来越多的企业开始采用远程办公和混合办公模式&#xff0c;以提升员工的灵活性和企业的敏捷性。然而&#xff0c;异地办公也带来了诸如桌面环境不一致、安全风险增加、沟通协作效率降低等诸多挑战。因此&#xff0c;如何打造一致、…

算法总结篇:二叉树

二叉树解题整体框架&#xff1a; 1、确定当前题型是做高度还是深度还是搜索树还是其他 高度&#xff08;从下往上&#xff0c;求根深度、高度等&#xff09;&#xff1a; 使用后序遍历会更加简单&#xff0c;递归方法一般需要返回值返回上级&#xff0c;让上级对返回值进行判断…

【Elasticsearch】most_fields、best_fields、cross_fields 的区别与用法

most_fields、best_fields、cross_fields 的区别与用法 1.核心区别概述2.详细解析与用法2.1 best_fields&#xff08;最佳字段匹配&#xff09;2.2 most_fields&#xff08;多字段匹配&#xff09;2.3 cross_fields&#xff08;跨字段匹配&#xff09; 3.对比案例3.1 使用 best…

力扣网C语言编程题:在数组中查找目标值位置之暴力解法

一. 简介 本文记录一下力扣网上涉及数组的问题&#xff1a;排序数组中查找目标值的位置。主要以C语言实现。 二. 力扣网C语言编程题&#xff1a;在数组中查找目标值位置 题目&#xff1a;在排序数组中查找元素的第一个和最后一个位置 给你一个按照非递减顺序排列的整数数组 …

OSCP - Proving Grounds - tre

主要知识点 突破边界的方法比较多样观察pspy64的检测结果 具体步骤 依旧nmap扫描开始,开放了80,8082,22端口 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-12-16 03:39 UTC Nmap scan report for 192.168.56.84 Host is up (0.00083s latency). Not shown: 65532 c…

【Mars3d】支持的basemaps数组与layers数组的坐标系列举

问题场景&#xff1a; basemap 是epsg4326的。&#xff0c;layer 图层是 epsg 4450的。可以在一个页面中展示吗&#xff1f; 回复&#xff1a; 可以不同坐标系叠加&#xff0c;但layer 图层是 epsg 4450的只支持arcgis动态服务&#xff0c;其他情况的不支持 wmts只支持3个坐标…

【算法】509. 斐波那契数

509. 斐波那契数 简单 相关标签 premium lock icon 相关企业 斐波那契数 &#xff08;通常用 F(n) 表示&#xff09;形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#xff1a; F(0) 0&#xff0c;F(1) 1 …