[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",

};

相关推荐
MediaTea4 小时前
Pr 视频过渡:沉浸式视频 - VR 色度泄漏
音视频·vr
LNTON羚通5 小时前
算法定制LiteAIServer摄像机实时接入分析平台烟火检测算法的主要功能
音视频·视频监控
EasyCVR10 小时前
EHOME视频平台EasyCVR视频融合平台使用OBS进行RTMP推流,WebRTC播放出现抖动、卡顿如何解决?
人工智能·算法·ffmpeg·音视频·webrtc·监控视频接入
简鹿办公11 小时前
使用 FFmpeg 进行音视频转换的相关命令行参数解释
ffmpeg·简鹿视频格式转换器·ffmpeg视频转换
冷凝女子12 小时前
【QT】海康视频及openCv抓拍正脸接口
qt·opencv·音视频·海康
安步当歌13 小时前
【WebRTC】视频编码链路中各个类的简单分析——VideoStreamEncoder
音视频·webrtc·视频编解码·video-codec
顾北川_野13 小时前
Android CALL关于电话音频和紧急电话设置和获取
android·音视频
顶呱呱程序13 小时前
2-143 基于matlab-GUI的脉冲响应不变法实现音频滤波功能
算法·matlab·音视频·matlab-gui·音频滤波·脉冲响应不变法
EasyCVR14 小时前
萤石设备视频接入平台EasyCVR多品牌摄像机视频平台海康ehome平台(ISUP)接入EasyCVR不在线如何排查?
运维·服务器·网络·人工智能·ffmpeg·音视频
runing_an_min14 小时前
ffmpeg 视频滤镜:屏蔽边框杂色- fillborders
ffmpeg·音视频·fillborders