当前位置: 首页 > news >正文

03-编码篇-x264编译与介绍

使用FFMPEG作编码操作时,会涉及到将yuv数据编码成h264数据,FFmpeg的libavcodec中的libx264.c会调用x264库的源码作编码:

1.x264库编译
下载X264,地址为:http://www.videolan.org/developers/x264.html,并解压。
mkdir my_build
./configure --enable-shared --prefix=./my_build/
make -j4
make install

2.编译后可以查看 my_build目录

.
|-- bin
|   `-- x264
|-- include
|   |-- x264.h
|   `-- x264_config.h
`-- lib|-- libx264.so -> libx264.so.164|-- libx264.so.164`-- pkgconfig`-- x264.pc

其中bin目录下x264为可执行文件,我们通过此可执行文件来分析x264库的相关功能

3.运行
通过-h信令,我们大致可以了解x264的主要功能和使用方法
./x264 -h

$ ./x264 -h
x264 core:164
Syntax: x264 [options] -o outfile infileInfile can be raw (in which case resolution is required),or YUV4MPEG (*.y4m),or Avisynth if compiled with support (yes).or libav* formats if compiled with lavf support (no) or ffms support (no).
Outfile type is selected by filename:.264 -> Raw bytestream.mkv -> Matroska.flv -> Flash Video.mp4 -> MP4 if compiled with GPAC or L-SMASH support (no)
Output bit depth: 8/10Options:-h, --help                  List basic options--longhelp              List more options--fullhelp              List all optionsExample usage:Constant quality mode:x264 --crf 24 -o <output> <input>Two-pass with a bitrate of 1000kbps:x264 --pass 1 --bitrate 1000 -o <output> <input>x264 --pass 2 --bitrate 1000 -o <output> <input>Lossless:x264 --qp 0 -o <output> <input>Maximum PSNR at the cost of speed and visual quality:x264 --preset placebo --tune psnr -o <output> <input>Constant bitrate at 1000kbps with a 2 second-buffer:x264 --vbv-bufsize 2000 --bitrate 1000 -o <output> <input>Presets:--profile <string>      Force the limits of an H.264 profileOverrides all settings.- baseline, main, high, high10, high422, high444--preset <string>       Use a preset to select encoding settings [medium]Overridden by user settings.- ultrafast,superfast,veryfast,faster,fast- medium,slow,slower,veryslow,placebo--tune <string>         Tune the settings for a particular type of sourceor situationOverridden by user settings.Multiple tunings are separated by commas.Only one psy tuning can be used at a time.- psy tunings: film,animation,grain,stillimage,psnr,ssim- other tunings: fastdecode,zerolatencyFrame-type options:-I, --keyint <integer or "infinite"> Maximum GOP size [250]--tff                   Enable interlaced mode (top field first)--bff                   Enable interlaced mode (bottom field first)--pulldown <string>     Use soft pulldown to change frame rate- none, 22, 32, 64, double, triple, euro (requires cfr input)Ratecontrol:-B, --bitrate <integer>     Set bitrate (kbit/s)--crf <float>           Quality-based VBR (-12-51) [23.0]--vbv-maxrate <integer> Max local bitrate (kbit/s) [0]--vbv-bufsize <integer> Set size of the VBV buffer (kbit) [0]-p, --pass <integer>        Enable multipass ratecontrol- 1: First pass, creates stats file- 2: Last pass, does not overwrite stats fileInput/Output:-o, --output <string>       Specify output file--sar width:height      Specify Sample Aspect Ratio--fps <float|rational>  Specify framerate--seek <integer>        First frame to encode--frames <integer>      Maximum number of frames to encode--level <string>        Specify level (as defined by Annex A)--quiet                 Quiet ModeFiltering:--vf, --video-filter <filter0>/<filter1>/... Apply video filtering to the input fileFilter options may be specified in <filter>:<option>=<value> format.Available filters:crop:left,top,right,bottomselect_every:step,offset1[,...]

4.建立一个工程,用于将YUV转成H264

编写测试程序
代码结构

.
|-- Makefile
|-- in420.yuv
|-- inc
|-- obj
|   `-- test.o
|-- out.h264
|-- src
|   `-- test.cpp
|-- third_lib
|   `-- x264
|       |-- include
|       |   |-- x264.h
|       |   `-- x264_config.h
|       `-- lib
|           `-- libx264.so
`-- video_prj

test.cpp内容:

#include <stdio.h>
#include <stdlib.h>#include "stdint.h"#if defined ( __cplusplus)
extern "C"
{
#include "x264.h"
};
#else
#include "x264.h"
#endifint main(int argc, char** argv)
{int ret;int y_size;int i,j;FILE* fp_src  = fopen("./in420.yuv", "rb");FILE* fp_dst = fopen("out.h264", "wb");int frame_num=50;int csp=X264_CSP_I420;int width=640,height=360;int iNal   = 0;x264_nal_t* pNals = NULL;x264_t* pHandle   = NULL;x264_picture_t* pPic_in = (x264_picture_t*)malloc(sizeof(x264_picture_t));x264_picture_t* pPic_out = (x264_picture_t*)malloc(sizeof(x264_picture_t));x264_param_t* pParam = (x264_param_t*)malloc(sizeof(x264_param_t));//Checkif(fp_src==NULL||fp_dst==NULL){printf("Error open files.\n");return -1;}x264_param_default(pParam);pParam->i_width   = width;pParam->i_height  = height;pParam->i_csp=csp;x264_param_apply_profile(pParam, x264_profile_names[5]);pHandle = x264_encoder_open(pParam);x264_picture_init(pPic_out);x264_picture_alloc(pPic_in, csp, pParam->i_width, pParam->i_height);y_size = pParam->i_width * pParam->i_height;//detect frame numberif(frame_num==0){fseek(fp_src,0,SEEK_END);switch(csp){case X264_CSP_I444:frame_num=ftell(fp_src)/(y_size*3);break;case X264_CSP_I420:frame_num=ftell(fp_src)/(y_size*3/2);break;default:printf("Colorspace Not Support.\n");return -1;}fseek(fp_src,0,SEEK_SET);}//Loop to Encodefor( i=0;i<frame_num;i++){switch(csp){case X264_CSP_I444:{fread(pPic_in->img.plane[0],y_size,1,fp_src);         //Yfread(pPic_in->img.plane[1],y_size,1,fp_src);         //Ufread(pPic_in->img.plane[2],y_size,1,fp_src);         //Vbreak;}case X264_CSP_I420:{fread(pPic_in->img.plane[0],y_size,1,fp_src);         //Yfread(pPic_in->img.plane[1],y_size/4,1,fp_src);     //Ufread(pPic_in->img.plane[2],y_size/4,1,fp_src);     //Vbreak;}default:{printf("Colorspace Not Support.\n");return -1;}}pPic_in->i_pts = i;ret = x264_encoder_encode(pHandle, &pNals, &iNal, pPic_in, pPic_out);if (ret< 0){printf("Error.\n");return -1;}printf("Succeed encode frame: %5d\n",i);for ( j = 0; j < iNal; ++j){fwrite(pNals[j].p_payload, 1, pNals[j].i_payload, fp_dst);}}i=0;//flush encoderwhile(1){ret = x264_encoder_encode(pHandle, &pNals, &iNal, NULL, pPic_out);if(ret==0){break;}printf("Flush 1 frame.\n");for (j = 0; j < iNal; ++j){fwrite(pNals[j].p_payload, 1, pNals[j].i_payload, fp_dst);}i++;}x264_picture_clean(pPic_in);x264_encoder_close(pHandle);pHandle = NULL;free(pPic_in);free(pPic_out);free(pParam);fclose(fp_src);fclose(fp_dst);return 0;
}

相关文章:

03-编码篇-x264编译与介绍

使用FFMPEG作编码操作时&#xff0c;会涉及到将yuv数据编码成h264数据&#xff0c;FFmpeg的libavcodec中的libx264.c会调用x264库的源码作编码&#xff1a; 1.x264库编译 下载X264&#xff0c;地址为&#xff1a;http://www.videolan.org/developers/x264.html&#xff0c;并解…...

生活自来水厂污水处理设备需要哪些

生活自来水厂是确保我们日常用水质量安全的重要设施。在自来水的生产过程中&#xff0c;污水处理设备是不可或缺的环节。那么&#xff0c;生活自来水厂的污水处理设备都有哪些呢&#xff1f;本文将为您详细介绍。 首先&#xff0c;生活自来水厂的污水处理设备主要包括预处理设备…...

Full names for abbreviations of Linux Commands

synopsis Towards/On Full names for abbreviations of Linux Commands I) website addressII) Mapping between full names and abbreviations I) website address II) Mapping between full names and abbreviations su&#xff1a;Swith user 切换用户&#xff0c;切换到ro…...

kafka下载安装部署

Apache kafka 是一个分布式的基于push-subscribe的消息系统&#xff0c;它具备快速、可扩展、可持久化的特点。它现在是Apache旗下的一个开源系统&#xff0c;作为hadoop生态系统的一部分&#xff0c;被各种商业公司广泛应用。它的最大的特性就是可以实时的处理大量数据以满足各…...

python包管理工具:pipenv的基本使用

很多语言都提供了环境隔离的支持&#xff0c;例如nodejs的node_module&#xff0c;golang的go mod&#xff0c;python也有virtualenv和pyvenv等机制。 为了建立依赖快照&#xff0c;通常会用pip freeze > requirements.txt 命令生成一个requirements.txt文件&#xff0c;在…...

AI系统ChatGPT网站系统源码AI绘画详细搭建部署教程,支持GPT语音对话+DALL-E3文生图+GPT-4多模态模型识图理解

一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作Ch…...

MC-4/11/03/400步进电机驱动器的主要驱动方式有哪些?

MC-4/11/03/400步进电机驱动器的主要驱动方式有哪些&#xff1f; 步进电机驱动器是一种将电脉冲转化为角位移的执行机构。当步进驱动器接收到一个脉冲信号&#xff0c;它就驱动步进电机按设定的方向转动一个固定的角度&#xff0c;这个固定的角度被称为“步距角”。步进电机不能…...

大数据技术原理与应用期末复习(林子雨)

大数据技术原理与应用期末复习&#xff08;林子雨&#xff09; Hadoop的特性HBase编程实践NoSQL的四大类型键值数据库优点&#xff1a;缺点&#xff1a; 列族数据库优点&#xff1a;缺点&#xff1a; 文档数据库优点&#xff1a;缺点&#xff1a; 图数据库优点&#xff1a;缺点…...

C练习——魔术师猜三位数

题目&#xff1a; 有一种室内互动游戏&#xff0c;魔术师要每位观众心里想一个三位数abc&#xff08;a、b、c分别是百位、十位和个位数字&#xff09;&#xff0c;然后魔术师让观众心中记下acb、bac、bca、cab、cba五个数以及这5个数的和值。只要观众说出这个和是多少&#xf…...

three.js 使用 tweenjs绘制相机运动动画

效果&#xff1a; 代码&#xff1a; <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red"></div><div class"box-right"…...

Oracle VARCHAR和VARCHAR2区别

在Oracle数据库中&#xff0c;VARCHAR和VARCHAR2是两种不同的数据类型&#xff0c;它们的区别如下&#xff1a; 1.存储空间 VARCHAR和VARCHAR2在存储空间上有所不同。在Oracle 7及以下版本中&#xff0c;VARCHAR类型的长度是固定的&#xff0c;如果存储的数据长度小于定义的长…...

HarmonyOS 开发基础(八)Row和Column

HarmonyOS 开发基础&#xff08;八&#xff09;Row和Column 一、Column 容器 1、容器说明&#xff1a; 纵向容器主轴方向&#xff1a;从上到下纵向交叉轴方向&#xff1a;从左到右横向 2、容器属性&#xff1a; justifyContent&#xff1a;设置子元素在主轴方向的对齐格式…...

Visual Studio中项目添加链接文件

这个需求在VS里面使用还真不多见&#xff0c;只是最近在做项目的版本编号的时候遇到一个头大的问题&#xff0c;我一个解决方案下面有几十个类库&#xff0c;再发布的时候这几十个类库的版本号必须要统一&#xff0c;之前我们都是在单个的AssemblyInfo.cs里面去改相关的信息&am…...

做一个个人博客第一步该怎么做?

做一个个人博客第一步该怎么做&#xff1f; 好多零基础的同学们不知道怎么迈出第一步。 那么&#xff0c;就找一个现成的模板学一学呗&#xff0c;毕竟我们是高贵的Ctrl c v 工程师。 但是这样也有个问题&#xff0c;那就是&#xff0c;那些模板都&#xff0c;太&#xff01;…...

vue前端开发自学练习,Props数据传递-类型校验,默认值的设置!

vue前端开发自学练习,Props数据传递-类型校验,默认值的设置&#xff01; 实际上&#xff0c;vue开发框架的时候&#xff0c;充分考虑到了前端开发人员可能会遇到的各种各样的情况&#xff0c;比如大家经常遇到的&#xff0c;数据类型的校验&#xff0c;再比如&#xff0c;默认…...

Fooocus 使用笔记

目录 换装&#xff0c;换脸&#xff0c;修复畸形 比较和使用教程&#xff1a; 安装教程&#xff1a; github地址&#xff1a; 换装&#xff0c;换脸&#xff0c;修复畸形 &#x1f525;迄今最全&#xff01;Fooocus AI绘图 详细教程 AI换装 AI换脸 AI修复畸形 - 西瓜视频 …...

18. 从零用Rust编写正反向代理, 主动式健康检查源码实现

wmproxy wmproxy是由Rust编写&#xff0c;已实现http/https代理&#xff0c;socks5代理&#xff0c; 反向代理&#xff0c;静态文件服务器&#xff0c;内网穿透&#xff0c;配置热更新等&#xff0c; 后续将实现websocket代理等&#xff0c;同时会将实现过程分享出来&#xff…...

[DM8] 达梦8配置兼容Oracle

查看版本信息 select *&#xff0c;id_code from v$version; 查询解释&#xff1a; DM Database Server 64 V8 1-1-190-21.03.12-136419-ENT 64 版本位数标识&#xff0c;64表示为64位版本&#xff0c;无64则表示为32位版本 V8 大版本号&#xff0c;目前主要是V7、V8 1-1-190…...

【Pytorch简介】1.Introduction 简介

Introduction 简介 大多数机器学习工作流涉及处理数据、创建模型、使用超参数优化模型&#xff0c;以及保存&#xff0c;然后推理已训练的模型。 本模块介绍在 PyTorch&#xff08;一种常用的 Python ML 框架&#xff09;中实现的完整机器学习 (ML) 工作流。 我们使用 Fashio…...

什么是Session以及如何在 NestJS 项目中的优雅管理 Session

前言 Web开发中一个常见的问题是用户身份的管理和状态保持。Session 就是处理这个问题的一个传统技术。在这篇文章中&#xff0c;我们将探讨Session是什么&#xff0c;为什么我们需要Session&#xff0c;以及在NestJS项目中如何优雅地管理Session。 什么是Session 众所周知&…...

RFM69无线通信进阶:从基础收发到可靠数据传输系统构建

1. 项目概述&#xff1a;从点对点收发迈向可靠通信在物联网和嵌入式开发领域&#xff0c;无线通信模块是连接物理世界与数字世界的桥梁。RFM69系列模块&#xff0c;特别是工作在433MHz或915MHz等Sub-GHz频段的RFM69HCW&#xff0c;因其出色的抗干扰能力、较远的传输距离以及相对…...

数据模型代码生成器:从OpenAPI/Schema自动生成Python类型安全模型

1. 项目概述&#xff1a;当数据模型遇上代码生成如果你经常和数据模型打交道&#xff0c;无论是OpenAPI规范、JSON Schema&#xff0c;还是数据库的DDL&#xff0c;那你一定体会过手动编写对应数据类&#xff08;Data Class&#xff09;或Pydantic模型的繁琐。一个字段类型写错…...

基于ESP32-S2与MAX17048的物联网电池监控系统设计与实现

1. 项目概述与核心价值 对于任何一个需要长期部署在户外的物联网设备&#xff0c;比如环境监测站、智能农业传感器或者远程摄像头&#xff0c;最让人头疼的问题往往不是代码bug&#xff0c;而是“它什么时候会没电&#xff1f;”。你不可能天天跑现场去检查&#xff0c;而设备…...

如何用FontForge从零设计专业字体?揭秘字体编辑器的核心玩法

如何用FontForge从零设计专业字体&#xff1f;揭秘字体编辑器的核心玩法 【免费下载链接】fontforge Free (libre) font editor for Windows, Mac OS X and GNULinux 项目地址: https://gitcode.com/gh_mirrors/fo/fontforge 想象一下&#xff0c;你手写的签名、设计的l…...

【PCL中Ptr释放问题 aligned_free 的2种解决方法】

PCL中Ptr释放问题 aligned_free解决方法1解决方法2解决方法1 添加avx指令&#xff0c;参考这篇博客https://blog.csdn.net/qq_60609496/article/details/123900817 解决方法2 我按照方法1尝试添加了avx或者sse等&#xff0c;都不行&#xff0c;我是要做一个静态库的时候链接…...

从网卡硬件到Linux内核:深入理解RSS多队列如何避免你的数据包‘堵车’

从网卡硬件到Linux内核&#xff1a;深入理解RSS多队列如何避免你的数据包‘堵车’ 想象一下早高峰时段的城市主干道&#xff1a;如果只有一条车道&#xff0c;所有车辆不得不排队缓行&#xff0c;而增加车道数量后车流立刻变得顺畅。网络数据包的处理同样遵循这一逻辑——当单队…...

MOXA NPort 5110串口服务器避坑指南:网线直连、波特率设置与Web管理那些事儿

MOXA NPort 5110串口服务器实战避坑手册&#xff1a;从硬件部署到批量管理的深度解析 第一次接触工业级串口服务器时&#xff0c;我对着那个巴掌大的金属盒子发呆了十分钟——RJ45、DB9、电源接口密密麻麻挤在一起&#xff0c;配套光盘里还有三个不同功能的配置工具。直到现场调…...

从GPS模块到地图显示:手把手教你用Python解析NMEA-0183协议数据

从GPS模块到地图显示&#xff1a;Python实战NMEA-0183协议解析全流程 当你第一次将GPS模块连接到电脑&#xff0c;看到串口终端不断刷新的$GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,*47这类神秘代码时&#xff0c;是否感到无从下手&#xff1f;本文将带你…...

Horos:免费开源医学影像软件,3D医疗图像处理的终极指南

Horos&#xff1a;免费开源医学影像软件&#xff0c;3D医疗图像处理的终极指南 【免费下载链接】horos Horos™ is a free, open source medical image viewer. The goal of the Horos Project is to develop a fully functional, 64-bit medical image viewer for OS X. Horos…...

开源AI代码助手本地化部署:从Cursor10x看私有化编程助手实践

1. 项目概述&#xff1a;当AI代码助手遇上开源社区如果你是一名开发者&#xff0c;最近可能频繁听到一个词&#xff1a;Cursor。这款集成了强大AI能力的代码编辑器&#xff0c;正以惊人的速度改变着许多人的编程习惯。它不再仅仅是一个文本编辑器&#xff0c;更像是一个能理解你…...