1.VP8的源码变换方案与H.264有哪些主要区别?
2.FFmpeg开发笔记(三十三)分析ZLMediaKit对H.264流的插帧操作
3.流媒体客户端RTMP拉流保存h264(flv保存为h264)
4.优秀的 Verilog/FPGA开源项目介绍(十)- H.264和H.265
5.xvid和h264有什么区别?
VP8的变换方案与H.264有哪些主要区别?
VP8的变换策略采用了类H.的框架,每个×的源码宏块被细分为个4×4的DCT块,每个块通过精确的源码DCT近似进行变换。其中,源码DC分量被单独处理,源码形成一个4×4的源码talnet 服务器源码组,进一步进行Hadamard变换。源码然而,源码VP8的源码变换方案与H.存在三点显著差异:第一点,VP8完全移除了8×8的源码变换,这与i8×8模式的源码去除类似。第二点,源码H.使用了一个精简的源码DCT,称为HCT,源码通过加减和右移简化运算,源码而VP8使用了一个过于精确的版本,涉及到较大乘法。这在VP3中并非首次,但与VC-1的实现方式不同。
第三点,Hadamard变换在VP8中扩展到了帧间预测块,不仅限于i×模式,还影响p×块。这个改动在处理小范围变换和解相关DC值方面表现出色。不过,VP8并未将层级变换应用到色度块,这是它与H.的主要区别。
总的来说,VP8的变换方案在性能上略逊于H.。8×8变换的缺失在高分辨率下影响细节保留,而且变换过程更为繁琐。尽管有改进的亮度DC变换,但对色度的支持不足。总的来说,VP8的源码到可执行变换方案在效率和精确度上不如H.。
扩展资料
VP8 是一个开放的图像压缩格式,最早由 On2 Technologiesis 开发,随后由 Google 发布。同时 Google 也发布了 VP8 编码的实做库:libvpx,以BSD授权条款的方式发布,随后也附加了专利使用权。而在经过一些争论之后,最终 VP8 的授权确认为一个开放源代码授权。FFmpeg开发笔记(三十三)分析ZLMediaKit对H.流的插帧操作
在H.流的传输与接收过程中,分析器揭示了其开头的“SPS帧→PPS帧→IDR帧”结构,验证了网络传输的H.裸流是如何被接收端正确解析视频格式的。利用雷霄骅的H分析器,我们能直观地观察到流的构成,进而理解其编码原理。
为了更深入理解H.流的处理流程,我们以ZLMediaKit为例,探索其在推流序列插入I帧时的特殊处理。在ZLMediaKit的ext-codec/H.cpp源码中,我们发现了HTrack::inputFrame_l函数中对I帧的处理逻辑。一旦检测到I帧,程序会自动插入SPS与PPS等配置帧,确保流媒体服务器能正确地将MP4文件转化为H.裸流。
通过深入分析ZLMediaKit的代码,我们发现其在关键帧后插入SPS帧与PPS帧的机制,以保持H.裸流的顺序性与完整性。这些配置帧的插入是确保客户端能够正确解析并渲染视频画面的关键。若未添加SPS与PPS帧,客户端在拉取流时会遇到错误,显示“non-existing PPS 0 referenced”,表明缺少必要的配置信息。
综合来看,ZLMediaKit通过在每个关键帧前额外插入SPS帧和PPS帧,不仅维护了H.裸流的正确格式,还确保了客户端能够顺利解析和渲染视频内容,源码基地是什么实现了高效的流媒体传输与播放体验。对于更深入的FFmpeg开发知识,推荐阅读《FFmpeg开发实战:从零基础到短视频上线》一书,了解更多关于流媒体处理与编码的实战技巧。
流媒体客户端RTMP拉流保存h(flv保存为h)
librtmp是通过调用int RTMP_Read(RTMP *r, char *buf, int size); 来拉取流,直接得到的流是flv格式,保存后即可播放。
RTMP_Read内部调用Read_1_Packet,其功能是从网络上读取一个RTMPPacket的数据,RTMP_Read在此基础上增加了个字节的flv头。
在librtmp的源码中,可以看到flv头信息。
flv头实际只有9个字节,但为何是个字节?因为除了9个字节的flv头外,还有多个Tag,每个Tag的开头有4个字节表示上一个Tag的长度,即使是第一个Tag也需填充这4个字节,以匹配源码中的flvHeader。
srs_librtmp是通过srs v2.0-r6版本(v2.0-r7版本加入了ipv6功能,但连接rtmp服务器时总是失败,可能是个人使用不当)来拉流并保存为flv文件。
从srs导出的srs_librtmp客户端详情见github.com/ossrs/srs/wiki...,导出后,在research/librtmp下有作者编写的demo,其中srs_rtmp_dump.c用于从rtmp服务器拉流并保存为flv文件。
以下是简化版的demo源码,我注释了自己的理解,若有错误请指正。在vs下此代码能编译运行,但在linux下能正常播放。
主要讲述了flv头信息的结构,srs_librtmp源码中srs_flv_write_tag通过data封装成Tag并写入flv文件,srs_rtmp_read_packet读取的数据是flv文件中的tag data。
Tag data分为Audio、-X= 115的源码Video、Script三种,这里仅讲解Video Tag Data。
VideoTagHeader的第一个字节包含了视频帧类型及视频CodecID的基本信息。VideoTagHeader之后跟着的是VIDEODATA数据,即video payload,对于H.格式的视频,VideoTagHeader会额外包含4个字节的信息。
AVCPacketType和CompositionTime。AVCPacketType表示VIDEODATA的内容类型:若AVCPacketType为0,则为AVCDecoderConfigurationRecord(H.序列头);若为1,则为一个或多个NALU(完整帧是必需的)。
AVCDecoderConfigurationRecord包含H.解码相关的sps和pps信息,解码器在送数据流之前必须送出sps和pps信息,否则解码器不能正常解码。在解码器停止后再次开始之前,如seek、快进快退状态切换等,都需要重新送出sps和pps的信息。AVCDecoderConfigurationRecord在FLV文件中通常只出现一次,即第一个video tag,但有些视频流的sps和pps可能会发生变化,所以可能会出现多次。
Composition Time用于告知渲染器视频帧进入解码器后多长时间在设备上显示。在flv格式中,timestamp用于告知帧何时提供给解码器,单位为毫秒。Composition Time告诉渲染器视频帧显示的时间,因此compositionTime = (PTS - DTS) / .0。
总结如下:使用srs_librtmp拉流,拉取的数据为一个又一个的Tag Data,可通过type与宏值比较判断Tag Data是否为Video Tag Data。连接rtmp服务器拉流时收到的第一个Video Tag Data通常包含PPS和SPS信息。对于每个h编码的gee引擎源码全套Video Tag Data,会多出4个字节的AVCPacketType和CompositionTime,其中CompositionTime用于B帧,这里暂时忽略它,我们仅支持P帧和I帧。Frame Type在h编码中只能是1或2,Frame Type == 1表示关键帧或包含PPS和SPS信息的Video Tag Data。CodecID在h编码中只能是7(AVC)。当AVCPacketType == 0时,Video Tag Data包含SPS和PPS信息;当AVCPacketType == 1时,为帧数据。
获取PPS和SPS信息非常关键,如果不告知解码器,根本无法播放视频。我写了一段代码,虽然技术有限,但希望能帮助到您。
AVCPacketType为1表示Video Tag Body的内容是NALU。Frame Type为1表示NALU内容是关键帧,Frame Type为2表示NALU内容是非关键帧。NALU的开头的4个字节表示NALU的长度(nalu_length),nalu_length之后是一个字节的nalu header。
nalu header中nal_ref_idc表示优先级,范围在~(2进制),值越大表示越重要。值指示NAL单元的内容不用于重建影响图像的帧间图像预测。对于nal_unit_type为6、9、、、的NAL单元,H.规范要求NRI的值应该为0。对于nal_unit_type等于7、8(指示顺序参数集或图像参数集)的NAL单元,H.编码器应设置NRI为(二进制格式)。nal_unit_type表示nalu类型,SPS开头是0x(nal_ref_idc为3,nal_unit_type为7),PPS开头是0x(nal_ref_idc为3,nal_unit_type为8),关键帧开头是0x(nal_ref_idc为3,nal_unit_type为5),非关键帧开头是0x(nal_ref_idc为2,nal_unit_type为1)。nal_unit_type为5表示idr帧,idr帧具有随机访问能力,所以每个idr帧前需要加上sps和pps。startcode起始码。
H.原始码流由一个一个的NALU组成,其结构包括起始码(0x或0x,取决于编码器实现)和数据。具体何时使用3个字节的起始码,何时使用4个字节的起始码,这个我没有完全弄明白,资料中提到具体哪种开头取决于编码器实现。0x是NAL起始前缀码,解码器检测每个起始码,作为NAL的起始标识,当检测到下一个起始码时,当前NAL结束。同时H.规定,当检测到0x时,也可以表示当前NAL的结束。对于NAL中数据出现0x或0x时,H.引入了防止竞争机制,如果编码器检测到NAL数据存在0x或0x时(非起始码,而是真正的音视频数据),编码器会在最后个字节前插入一个新的字节0x,这样当遇到0x或0x时就一定是起始码了。解码器检测到0x时,把抛弃,恢复原始数据。因此,组装H的步骤如下:读取tag data并判断是否是video tag data,判断frameType和AVCPacketType,区分video tag data是AVCDecoderConfigurationRecord还是NALU,如果是AVCDecoderConfigurationRecord则解析PPS和SPS保存在内存中并加上startcode(我这里加的是0x),如果是NALU,则判断nal_unit_type(有些NALU的流比较奇怪,依然包含PPS、SPS信息,甚至还有SEI信息)。switch case根据不同的nal_unit_type来解析,并加上startcode。如果nal_unit_type == 0x,则是idr帧,需要加上PPS和SPS信息(即一个idr通常包含3个startcode,SPS一个PPS一个idr帧数据一个)。
以下是完整代码:
rtmpTo.h
rtmpTo.cpp
main.cpp
原文链接:blog.csdn.net/qq_...
优秀的 Verilog/FPGA开源项目介绍(十)- H.和H.
H.是ITU-TVCEG在H.之后推出的新视频编码标准,它在保留H.某些技术的基础上,对相关技术进行了改进。H.采用了先进技术,以优化码流、编码质量、延时和算法复杂度之间的关系,旨在提高压缩效率、鲁棒性和错误恢复能力,减少实时延时和信道获取时间,降低复杂度。
H.,即MPEG-4第十部分,是由ITU-T视频编码专家组(VCEG)和ISO/IEC动态图像专家组(MPEG)联合组成的联合视频组(JVT)提出的高度压缩数字视频编解码器标准。H.的最大优势是其高数据压缩比率,在同等图像质量的条件下,其压缩比是MPEG-2的2倍以上,是MPEG-4的1.5~2倍。
H.旨在在有限带宽下传输更高质量的网络视频,仅需原先的一半带宽即可播放相同质量的视频。这意味着,我们的智能手机、平板机等移动设备将能够直接在线播放p的全高清视频。H.标准也同时支持4K(×)和8K(×)超高清视频。
H.与H.的不同之处在于,H.在H.的基础上进行了改进,包括帧内预测、帧间预测、转换、量化、去区块滤波器和熵编码等模块。H.的编码架构大致上与H.相似,但整体被分为三个基本单位:编码单位(CU)、预测单位(PU)和转换单位(TU)。
复旦大学H./H.开源IP,包括H. Video Encoder IP Core,是由复旦大学专用集成电路与系统国家重点实验室(State Key Lab of ASIC & System,Fudan University)视频图像处理实验室(VIP Lab)范益波教授研究团队开发完成,并开放源代码。
开源地址:openasic.org
关于上板验证,网站上有相关的验证板卡代码,如下:
github上的开源H.,开源地址:github.com/tishi/h...
用verilog和system verilog编写,在FPGA板上用Xilinx ZYNQ验证,运行最高MHZ。
内容:文件夹“src”包含所有解码源文件。文件夹“tb”包含测试台文件,ext_ram_.v使用axi3接口模拟ddr。文件夹“pli_fputc”是verilog pli,用于在运行模拟时将输出bin写入文件。
使用方法:模拟:将所有测试平台和源代码文件添加到您的模拟项目源中,例如modelsim。将测试文件in.放到您的模拟项目文件夹中。然后运行,例如,对于modelsim,运行“vsim -pli pli_fputc.dll bitstream_tb”。输出是out.yuv和一些日志文件。
在FPGA板上运行:将“src”文件夹中的源文件添加到您的FPGA项目中。顶部文件是decode_stream.sv。两个接口,stream_mem_xxx用于将H比特流馈送到解码器。
github上的开源H.,开源地址:github.com/aiminickwong...
无介绍
说明:第一个项目由复旦大学专用集成电路与系统国家重点实验室(State Key Lab of ASIC & System,Fudan University)视频图像处理实验室(VIP Lab)推出,不论项目完成度还是文档说明,都非常详细,同时上面给的是该项目的论坛,论坛上有相关工作人员维护,活跃度很高,适合去学习使用。
后面两个项目,碎碎并没验证过,但是感觉不怎么靠谱,README完整度不高,有兴趣的可以去看看。
最后,还是感谢各个大佬开源的项目,让我们受益匪浅。后面有什么感兴趣方面的项目,大家可以在后台留言或者加微信留言,今天就到这,我是爆肝的碎碎思,期待下期文章与你相见。
优秀的 Verilog/FPGA开源项目介绍(九)- DP(增改版)
优秀的 Verilog/FPGA开源项目介绍(八)- HDMI
优秀的 Verilog/FPGA开源项目介绍(七)- CAN通信
介绍一些新手入门FPGA的优秀网站(新增2)
优秀的 Verilog/FPGA开源项目介绍(六)- MIPI
优秀的 Verilog/FPGA开源项目介绍(五)- USB通信
优秀的 Verilog/FPGA开源项目介绍(四)- Ethernet
优秀的 Verilog/FPGA开源项目介绍(三)- 大厂的项目
优秀的 Verilog/FPGA开源项目介绍(二)-RISC-V
优秀的 Verilog/FPGA开源项目介绍(一)-PCIe通信
xvid和h有什么区别?
1.MPEG4(Xvid):Xvid是一个开放源代码的MPEG-4视频编解码器,它是基于OpenDivX而编写的。
MPEG是Moving Pictures Experts Group(动态图像专家组)的简称,是国际标准化组织(ISO)成立的专责制定有关运动图像压缩编码标准的工作组所制定的国际通用标准。
2.MPEG4(DivX) :
DivX是一种数字视频格式,支持MPEG-4, H.和最新H.标准的视频,分辨率可高达4K超高清。
3.AVC(H):
H是由ITU-T视频编码专家组(VCEG)和ISO/IEC动态图像专家组(MPEG)联合组成的联合视频组(JVT,Joint Video Team)提出的高度压缩数字视频编解码器标准。
AVC是高级视频编码的简称(Advanced Video Coding),视频编解码技术有两套标准,H.、国际电联(ITU-T)的标准H.、H.+等
扩展资料
Xvid是由一群原OpenDivX义务开发者在OpenDivX于年7月停止开发后自行开发的。Xvid支持多种编码模式,量化(Quantization)方式和范围控,运动侦测(Motion Search)和曲线平衡分配(Curve)等众多编码技术,对用户来说功能十分强大。
Xvid的主要竞争对手是DivX。但Xvid是开放源代码的,而DivX则只有免费(不是自由)的版本和商用版本。
DivX也不单只是数字视频格式。除推出软件之外,DivX还对消费电子设备进行认证,让数字视频不但能在PC和Mac上用软件播放,还能直接通过U盘、存储卡的方式,在电视机、蓝光机、DVD机、手机等电子产品上直接播放。
百度百科-XviD
百度百科-DIVX
百度百度-H.