FFmpeg YUV编码为H264
使用FFmpeg库把YUV420P文件编码为H264文件,FFmpeg版本为4.4.2-0。
需要yuv测试文件的,可以从我上传的MP4文件中用ffmpeg提取,命令如下:
ffmpeg -i <input.mp4> -pix_fmt yuv420p <output.yuv>
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libavutil/opt.h>
#include <libavutil/mem.h>
#include <libavutil/imgutils.h>
#include <libswscale/swscale.h>int main(int argc, char *argv[])
{int ret = -1;int frame_index = 0;const char *input_file = argv[1];const char *output_file = argv[2];FILE *input_yuv = NULL;AVFormatContext *format_context = NULL;AVCodecContext *codec_context = NULL;AVStream *stream = NULL;AVCodec *codec = NULL;AVFrame *frame = NULL;AVPacket *packet = NULL;const AVOutputFormat *ofmt = NULL;int in_width = 1280; // 输入YUV文件的宽度int in_height = 720; // 输入YUV文件的高度enum AVPixelFormat in_pix_fmt = AV_PIX_FMT_YUV420P; // 输入YUV文件的像素格式int frame_rate = 24; // 输出视频帧率if (argc < 3){fprintf(stderr, "Usage: %s <input file> <output file>\n", argv[0]);return -1;}input_yuv = fopen(input_file, "rb");if (!input_yuv){fprintf(stderr, "open input file failed\n");goto end;}// 分配输出格式上下文avformat_alloc_output_context2(&format_context, NULL, NULL, output_file);if (!format_context){fprintf(stderr, "avformat_alloc_output_context2 failed\n");goto end;}ofmt = format_context->oformat;// 查找编码器codec = avcodec_find_encoder(AV_CODEC_ID_H264);if (!codec){fprintf(stderr, "Codec not found\n");goto end;}printf("codec name: %s\n", codec->name);// 创建新的视频流stream = avformat_new_stream(format_context, NULL);if (!stream){fprintf(stderr, "avformat_new_stream failed\n");goto end;}// 分配编码器上下文codec_context = avcodec_alloc_context3(codec);if (!codec_context){fprintf(stderr, "avcodec_alloc_context3 failed\n");goto end;}/* 设置编码器参数 */codec_context->codec_id = AV_CODEC_ID_H264;codec_context->codec_type = AVMEDIA_TYPE_VIDEO;codec_context->pix_fmt = AV_PIX_FMT_YUV420P;codec_context->width = in_width;codec_context->height = in_height;codec_context->time_base = (AVRational){1, frame_rate}; // 设置时间基codec_context->framerate = (AVRational){frame_rate, 1}; // 设置帧率codec_context->bit_rate = 1456 * 1000; // 设置比特率codec_context->gop_size = frame_rate; // 设置GOP大小codec_context->max_b_frames = 1; // 设置最大B帧数,不需要B帧时设置为0av_opt_set(codec_context->priv_data, "profile", "main", 0); // 设置h264画质级别// 打开编码器if (avcodec_open2(codec_context, codec, NULL) < 0){fprintf(stderr, "avcodec_open2 failed\n");goto end;}// 将编码器参数复制到流int result = avcodec_parameters_from_context(stream->codecpar, codec_context);if (result < 0){fprintf(stderr, "avcodec_parameters_from_context failed\n");goto end;}// 打开输出文件if (!(ofmt->flags & AVFMT_NOFILE)) // 检查输出格式是否需要文件存储{result = avio_open(&format_context->pb, output_file, AVIO_FLAG_WRITE);if (result < 0){fprintf(stderr, "open output file failed\n");goto end;}}// 写文件头result = avformat_write_header(format_context, NULL);if (result < 0){fprintf(stderr, "avformat_write_header failed\n");goto end;}frame = av_frame_alloc();packet = av_packet_alloc();if (!frame || !packet){fprintf(stderr, "allocate frame or packet failed\n");goto end;}// 设置帧参数frame->format = codec_context->pix_fmt;frame->width = codec_context->width;frame->height = codec_context->height;// 分配帧数据缓冲区result = av_frame_get_buffer(frame, 0);if (result < 0){fprintf(stderr, "av_frame_get_buffer failed\n");goto end;}// 计算输入缓冲区大小int input_buffer_size = av_image_get_buffer_size(in_pix_fmt, in_width, in_height, 1);uint8_t *input_buffer = (uint8_t *)av_malloc(input_buffer_size);if (!input_buffer){fprintf(stderr, "av_malloc failed\n");goto end;}// 编码循环while (1){// 读取YUV数据到缓冲区result = fread(input_buffer, 1, input_buffer_size, input_yuv);if (result <= 0){break;}// 填充帧数据av_image_fill_arrays(frame->data, frame->linesize, input_buffer, in_pix_fmt, in_width, in_height, 1);frame->pts = frame_index;frame_index++;// 发送帧到编码器result = avcodec_send_frame(codec_context, frame);if (result < 0){fprintf(stderr, "avcodec_send_frame error (errmsg '%s')\n", av_err2str(result));goto end;}// 接收编码后的数据包while (result >= 0){result = avcodec_receive_packet(codec_context, packet);if (result == AVERROR(EAGAIN) || result == AVERROR_EOF){break;}else if (result < 0){fprintf(stderr, "avcodec_receive_packet error (errmsg '%s')\n", av_err2str(result));goto end;}packet->stream_index = stream->index;// 将时间戳从编码器时间基转换到流时间基av_packet_rescale_ts(packet, codec_context->time_base, stream->time_base);// 写数据包到输出文件result = av_interleaved_write_frame(format_context, packet);if (result < 0){fprintf(stderr, "av_interleaved_write_frame failed\n");av_packet_unref(packet);goto end;}av_packet_unref(packet);}}av_free(input_buffer);// 发送NULL帧到编码器,刷新编码器内部缓冲区result = avcodec_send_frame(codec_context, NULL);while (result >= 0){result = avcodec_receive_packet(codec_context, packet);if (result == AVERROR_EOF){break;}else if (result < 0){fprintf(stderr, "avcodec_receive_packet error (errmsg '%s')\n", av_err2str(result));goto end;}packet->stream_index = stream->index;av_packet_rescale_ts(packet, codec_context->time_base, stream->time_base);result = av_interleaved_write_frame(format_context, packet);if (result < 0){fprintf(stderr, "av_interleaved_write_frame failed\n");av_packet_unref(packet);goto end;}av_packet_unref(packet);}// 写文件尾av_write_trailer(format_context);ret = 0;end:if (frame)av_frame_free(&frame);if (packet)av_packet_free(&packet);if (codec_context)avcodec_free_context(&codec_context);if (ofmt && !(ofmt->flags & AVFMT_NOFILE))avio_close(format_context->pb);if (format_context)avformat_free_context(format_context);if (input_yuv)fclose(input_yuv);return ret;
}
相关文章:
FFmpeg YUV编码为H264
使用FFmpeg库把YUV420P文件编码为H264文件,FFmpeg版本为4.4.2-0。 需要yuv测试文件的,可以从我上传的MP4文件中用ffmpeg提取,命令如下: ffmpeg -i <input.mp4> -pix_fmt yuv420p <output.yuv> 代码如下:…...
【C语言】顺序表(上卷)
什么是数据结构? 数据结构是由“数据”和“结构”两词组合而来的。 数据需要管理。数据结构就是计算机存储、组织数据的方式。比如一个班级就是一个结构,管理的就是班级里的学生。如果我们要找三年2班的同学李华,就可以直接去三年2班找而不…...
Luma AI如何注册:文生视频领域的新星
文章目录 Luma AI如何注册:文生视频领域的新星一、Luma 注册方式二、Luma 的效果三、Luma 的优势四、Luma 的功能总结 Luma AI如何注册:文生视频领域的新星 近年来,Luma AI 凭借其在文生视频领域的创新技术,逐渐成为行业的新星。…...
一站式实时数仓Hologres整体能力介绍
讲师:阿里云Hologres PD丁烨 一、产品定位 随着技术的进步,大数据正从规模化转向实时化处理。用户对传统的T1分析已不满足,期望获得更高时效性的计算和分析能力。例如实时大屏,城市大脑的交通监控、风控和实时的个性化推荐&…...
如何在 Windows 上安装 Docker Desktop
如何在 Windows 上安装 Docker Desktop Docker 是一个开放平台,用于开发、部署和运行应用程序。Docker Desktop 是 Docker 在 Windows 和 macOS 上的官方客户端,它使得开发者能够轻松地在本地环境中构建、运行和共享容器化应用程序。本文将详细介绍如何…...
WPF由文本框输入的内容动态渲染下拉框
在做项目过程中,需要扫码枪扫描快递单号或者手动输入快递单号时,自动检索该单号是哪个快递公司的,下拉框中自动带出该单号的快递公司。当输入的快递单号不存在时,将数据库中所有快递公司都带出 效果: 通过输入的快递单…...
RPCMon:一款基于ETW的RPC监控工具
关于RPCMon RPCMon是一款基于事件跟踪的WindowsRPC监控工具,该工具是一款GUI工具,可以帮助广大研究人员通过ETW(Event Tracing for Windows)扫描RPC通信。 RPCMon能够为广大研究人员提供进程之间RPC通信的高级视图,该…...
【odoo】常用的字符转义:“>“,“<“,““,“/“等
概要 字符转义是指在编写代码或处理文本数据时,将特殊字符转换为另一种形式,以便在特定的上下文中正确解析和处理这些字符。 内容 特殊字符描述XML转义表示法&和符号&<小于符号<>大于符号>"双引号"单引号&ap…...
李宏毅深度学习项目——HW1个人笔记
视频链接 PDF链接 googleColab链接 GoogleColab是一个免费的jupyter notebook,可以用上面的gpu资源进行训练 题目 通过前两天的数据,预测第三天某个人感染新冠的概率 范例 导包 # Numerical Operations import math import numpy as np# Reading/Wr…...
3D Gaussian Splatting Windows安装
0.安装C++ 编译器 https://aka.ms/vs/17/release/vs_buildtools.exe 1.下载源码 git clone https://github.com/graphdeco-inria/gaussian-splatting --recursive 2.安装cuda NVIDIA GPU Computing Toolkit CUDA Toolkit Archive | NVIDIA Developer 3.安装COLMAP...
人脸识别——可解释的人脸识别(XFR)人脸识别模型是根据什么来识别个人的
可解释性人脸识别(XFR)? 人脸识别有一个任务叫1:N(识别)。这个任务将一个人的照片与N张注册照片进行比较,找出相似度最高的人。 这项任务用于刑事调查和出入境点。在犯罪调查中,任务从监控摄像…...
仓库管理系统的设计
管理员账户功能包括:系统首页,个人中心,管理员管理,公告管理,物资管理,基础数据管理,用户管理 用户账户功能包括:系统首页,个人中心,公告管理,物…...
最火AI角色扮演流量已达谷歌搜索20%!每秒处理2万推理请求,Transformer作者公开优化秘诀
卡奥斯智能交互引擎是卡奥斯基于海尔近40年工业生产经验积累和卡奥斯7年工业互联网平台建设的最佳实践,基于大语言模型和RAG技术,集合海量工业领域生态资源方优质产品和知识服务,旨在通过智能搜索、连续交互,实时生成个性化的内容…...
MySQL:MySQL分组排序函数rank()、row_number()、dense_rank()与partition by结合使用
一、前言 在 MySQL 中,虽然标准的 SQL 函数 RANK(), ROW_NUMBER(), 和 DENSE_RANK() 是 SQL 标准的一部分,但早期的 MySQL 版本并不直接支持这些窗口函数。然而,从 MySQL 8.0 开始,这些函数被引入以支持窗口函数(也称为…...
opencv c++ 检测图像尺寸大小,标注轮廓
1. 项目背景 本项目旨在开发一个图像处理程序,通过使用计算机视觉技术,能够自动检测图像中物体的尺寸并进行分类。项目利用了开源的计算机视觉库 OpenCV,实现了图像的灰度处理、二值化、轮廓检测、边界框绘制以及尺寸分类等功能。通过这些功…...
Python数据可视化基础:使用Matplotlib绘制图表
Python数据可视化基础:使用Matplotlib绘制图表 数据可视化是数据分析中的重要环节,它可以帮助我们更直观地理解数据。Python作为一门强大的编程语言,提供了多种库来支持数据可视化,其中Matplotlib是最为流行和功能丰富的库之一。…...
Java开发接口设计的原则
在现代软件开发实践中,接口设计扮演着至关重要的角色。它不仅关乎代码的结构和未来的可维护性,还直接影响到软件系统的灵活性和扩展性。本文将通过实例详解几个核心的接口设计原则,帮助开发者更好地编写和管理接口,从而提升软件的…...
[火灾警报系统]yolov5_7.0-pyside6火焰烟雾识别源码
国内每年都会发生大大小小的火灾,造成生命、财产的损失。但是很多火灾如果能够早期发现,并及时提供灭火措施,将会大大较小损失。本套源码采用yolov5-7.0目标检测算法结合pyside6可视化界面源码,当检测到火灾时,能否发出…...
机器学习和深度学习区别
定义和范围: 机器学习:是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。它专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改…...
【功能详解】银河麒麟操作系统“安全启动”是如何发挥作用的?
2023年12月,财政部、工信部发布了7项信息类产品《政府采购需求标准》,为包括操作系统在内多项产品的政府集中采购提供政策支撑。其中,安全、可信作为国产操作系统的基本要求备受关注。 安全体系的构建离不开操作系统本身的硬实力,…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...
【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...
CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝
目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为:一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...
libfmt: 现代C++的格式化工具库介绍与酷炫功能
libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库,提供了高效、安全的文本格式化功能,是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全:…...
实战三:开发网页端界面完成黑白视频转为彩色视频
一、需求描述 设计一个简单的视频上色应用,用户可以通过网页界面上传黑白视频,系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观,不需要了解技术细节。 效果图 二、实现思路 总体思路: 用户通过Gradio界面上…...
nnUNet V2修改网络——暴力替换网络为UNet++
更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...
用鸿蒙HarmonyOS5实现中国象棋小游戏的过程
下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...
全面解析数据库:从基础概念到前沿应用
在数字化时代,数据已成为企业和社会发展的核心资产,而数据库作为存储、管理和处理数据的关键工具,在各个领域发挥着举足轻重的作用。从电商平台的商品信息管理,到社交网络的用户数据存储,再到金融行业的交易记录处理&a…...
