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

[ffmpeg系列 02] 音视频基本知识

一 视频

RGB:
AV_PIX_FMT_RGB24, ///< packed RGB 8:8:8, 24bpp, RGBRGB…

Y:明亮度, Luminance或luma, 灰阶图,
UV:色度,Chrominance或Chroma。
YCbCr: Cb蓝色分量,Cr是红色分量。
取值范围:0-256。

I420(yuv420p):4:2:0, 宽高是4x4:YYYYYYYYYYYYYYYYUUUUVVVV。
YUV大小:宽*高*1.5,Y占大小:宽*高,U占大小:宽*高/4,UV一样大。

YUV拼接:
上下:
Y1…Y16Y1…Y16U1…U4U1…U4V1…V4V1…V4

左右:
Y1…Y4Y1…Y4(重复四个)U1U2U1U2(重复2个)V1V2V1V2(重复2个)

两种打包格式:
planar平面、packed。

AV_PIX_FMT_YUV420P, ///< planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
data[0]–Y, data[1]–U, data[2]–V。

AV_PIX_FMT_YUYV422, ///< packed YUV 4:2:2, 16bpp, Y0 Cb Y1 Cr
data[0]–YYYYUUVV,

AV_PIX_FMT_NV12, ///< planar YUV 4:2:0, 12bpp, 1 plane for Y and 1 plane for the UV components,
which are interleaved (first byte U and the following byte V)
data[0] - Y, data[1] - packed UV(UVUV)

码率(视频质量差,可以提高码率试试)、
帧率、分辨率、

I帧、P帧、B帧区别:
I帧是帧内编码,能独立解码成功。
P帧是帧间编码,前向预测,依赖于I帧或前面的P帧。
B帧是帧间编码,双向预测,依赖于I帧或前面、后面的P帧。
播放带B帧的视频:需要把B帧后面的P帧解码了,再播放。
压缩比:B>P>I。

带B帧的解码显示顺序:

二 音频

AV_SAMPLE_FMT_S16, ///< signed 16 bits
AV_SAMPLE_FMT_FLTP, ///< float, planar
Planar(平面的,带P)是左右声道分开存储,左声道data[0],右声道data[1]。Ffmpeg内部存储使用的格式AV_SAMPLE_FMT_FLTP。
不带P,交错排序LRLR,data[0],比如S16。

比较常用的音频格式:mp3、AAC、opus。

编码AAC:比如S16,双通道,一帧PCM数据字节数:1024*2*2=4096字节。
AAC LOW–1024、mp3–1152。
编码前格式要求FLTP。
一帧AAC播放的时间:1024/48000=21.33333333ms。

opus支持AV_SAMPLE_FMT_S16, frame_size =960。

const AVCodec ff_aac_encoder = {
.name = “aac”,
.long_name = NULL_IF_CONFIG_SMALL(“AAC (Advanced Audio Coding)”),
.type = AVMEDIA_TYPE_AUDIO,
.id = AV_CODEC_ID_AAC,
.priv_data_size = sizeof(AACEncContext),
.init = aac_encode_init,
.encode2 = aac_encode_frame,
.close = aac_encode_end,
.defaults = aac_encode_defaults,
.supported_samplerates = mpeg4audio_sample_rates,
.caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP,
.capabilities = AV_CODEC_CAP_SMALL_LAST_FRAME | AV_CODEC_CAP_DELAY,
.sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_FLTP,
AV_SAMPLE_FMT_NONE },
.priv_class = &aacenc_class,
};

const AVCodec ff_libfdk_aac_encoder = {
.name = “libfdk_aac”,
.long_name = NULL_IF_CONFIG_SMALL(“Fraunhofer FDK AAC”),
.type = AVMEDIA_TYPE_AUDIO,
.id = AV_CODEC_ID_AAC,
.priv_data_size = sizeof(AACContext),
.init = aac_encode_init,
.encode2 = aac_encode_frame,
.close = aac_encode_close,
.capabilities = AV_CODEC_CAP_SMALL_LAST_FRAME | AV_CODEC_CAP_DELAY,
.sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S16,
AV_SAMPLE_FMT_NONE },
.priv_class = &aac_enc_class,
.defaults = aac_encode_defaults,
.profiles = profiles,
.supported_samplerates = aac_sample_rates,
.channel_layouts = aac_channel_layout,
.wrapper_name = “libfdk”,
};

const AVCodec ff_libopus_encoder = {
.name = “libopus”,
.long_name = NULL_IF_CONFIG_SMALL(“libopus Opus”),
.type = AVMEDIA_TYPE_AUDIO,
.id = AV_CODEC_ID_OPUS,
.priv_data_size = sizeof(LibopusEncContext),
.init = libopus_encode_init,
.encode2 = libopus_encode,
.close = libopus_encode_close,
.capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_SMALL_LAST_FRAME,
.sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S16,
AV_SAMPLE_FMT_FLT,
AV_SAMPLE_FMT_NONE },
.supported_samplerates = libopus_sample_rates,
.priv_class = &libopus_class,
.defaults = libopus_defaults,
.wrapper_name = “libopus”,
};

http://www.lryc.cn/news/271568.html

相关文章:

  • 【ASP.NET Core 基础知识】--目录
  • java数据结构与算法刷题-----LeetCode509. 斐波那契数
  • vue3 element plus el-table封装(二)
  • cnn lstm结合网络
  • Ubuntu连接xshell
  • nginx安装和配置
  • 【头歌实训】kafka-入门篇
  • 华为云创新中心,引领浙南的数字化腾飞
  • 240101-5步MacOS自带软件无损快速导出iPhone照片
  • github鉴权失败
  • 2023湾区产城创新大会:培育数字化供应链金融新时代
  • 多维时序 | MATLAB实现SSA-GRU麻雀算法优化门控循环单元多变量时间序列预测
  • 二叉树的前序遍历 、二叉树的最大深度、平衡二叉树、二叉树遍历(leetcode)
  • SQL之CASE WHEN用法详解
  • Ubuntu 18.04搭建RISCV和QEMU环境
  • 立足兴趣社交赛道,Soul创新在线社交元宇宙新玩法
  • Couchdb 任意命令执行漏洞(CVE-2017-12636)
  • VectorWorks各版本安装指南
  • 【MySQL】数据库中为什么使用B+树不用B树
  • 微信小程序发送模板消息-详解【有图】
  • Easy Rules规则引擎实战
  • 听GPT 讲Rust源代码--library/alloc(2)
  • OSG读取和添加节点学习
  • 计算机网络技术--念念
  • C#_var
  • Linux---进程控制
  • Java注解学习,一文掌握@Autowired 和 @Resource 注解区别
  • 系列一、如何正确的获取Spring Cloud Alibaba Spring Cloud Spring Boot之间的版本对应关系
  • 数据预处理:标准化和归一化
  • Node.js+Express 路由配置,实现接口分类管理