H264/H265编码
1、通常在处理音视频数据时,我们如何选择解码器?
通常我们不是根据 NALU 裸流数据中的信息来选择解码器,而是根据媒体封装层的信息来确定解码器。媒体封装层是表示媒体数据是什么封装格式的,比如 MP4、FLV。在这层信息里,通常会携带码流编码格式的信息。拿 MP4 来说,我们可以根据 Sample Description Box(moov/trak/mdia/minf/stbl/stsd) 中的信息来确定其封装的码流的编码格式。对于 FLV,我们可以根据 VideoTagHeader 中的 CodecID 等信息来确定其封装的码流的编码格式。这样的好处是效率比较高,解封装的时候就可以确定选择何种解码器了。
2、怎么识别 NALU 裸流数据的编码格式是 H.264 还是 H.265?
但是,如果出现题目中的情况,没有对码流进行封装,而是直接传输码流时,这时候 NALU 中有什么字段能标识自己的编码格式吗?答案是,没有这样明确的字段能标识码流的编码格式。但是这个问题也不是不能解决,因为 H.264、H.265 码流本身也是遵循一定格式规范的,我们可以按照它的格式规范进行探测,如果能解析出来正确的信息,那也可以确定它的编码格式。比如,拿 H.265 来说,FFmpeg 中 hevcdec.c 就有对其码流数据进行探测的函数hevc_probe(...)。所以,我们可以按照编码格式规范探测,比如 H.265 如果解析出了 pps、sps、vps 的各字段信息符合规范,就认为它是 H.265 的编码;如果不是,在你们的码流格式范围中就只剩 H.264 了;接下来将码流数据交给对应的解码器解码即可。
3、RGB和YUV的优缺点
(3) 画质对比:H.265比 H.264人物皮肤更细腻
也许你会认为,H.265既然压缩率高了,画质肯定有所损失。对于这个问题,大家尽可放心。在H.264等编码技术中,各巨区块间的数据彼此完全独立、没有相依性,于是很容易受编码过程中产生的失真影响,在巨区块的边界区域产生噪声,导致将所有巨区块组合成完整画面时,发生图像无法完全合并的状况。而H.265引了一个Deblocking filter功能,deblocking filter在运作时会侦测临近巨区块的数据,重新建立巨区块间之数据依赖性,尽量将边缘区域平滑化,提高整体图像质量。