我正在研究 HEVC,并且对视频压缩非常陌生。我要做的第一件事是查看丢包对解码视频的影响。我想修改解码器,以便可以在 hevc 比特流上引入丢包。我将使用 NS2 生成的错误模式。我应该关注解码器的哪一部分?如何将错误模式插入 hevc 比特流?哪些具体变量决定了帧数和切片数?我正在使用 HM 16.6。谢谢
2 回答
我曾经开发过一个 Python 工具,它可以侵入比特流并翻转比特。我所做的是线性读取编码器生成的比特流文件,并将比特翻转过程随机化。因为我知道 NAL 单元的结构,所以从标准规范中,我可以知道我的损坏位在哪里。开始操作的最佳部分是 NAL 单元标头。视频、序列、切片标头。您可以根据打包过程参数判断它们的位置。已经很久了,所以我忘记了细节。标头并不能说明比特流的所有信息,尤其是帧、片号。它可能是基于虱子的或基于瓷砖的,或者我忘了还有什么。但是你可以从标题中看出。现在解码器将在解码时知道帧、切片编号并遵循编码器的指南。所以你需要知道的将在标题中。检查最新的工作草案并研究标题信息。
我将其发布为答案而不是评论,因为我没有评论的声誉。在 HEVC 中,切片是帧内的一组连续 CTU(编码树单元)。此外,HEVC 引入了将切片拆分为所谓的切片段,主要用于低延迟设备。当一个切片被分割成多个切片段时,只有第一个切片段携带解码整个切片所需的头信息。剩余的依赖切片段指的是解码期间的初始切片段。每个切片段(或如果不使用分段,则为切片)映射到称为“NAL(网络抽象层)单元”的单个数据单元。一个 NAL 单元是物理通道中的视频数据包有效载荷,因此,传输过程中的数据包丢失对应于 NAL 单元丢失,因此对应于切片丢失。如果您研究 HEVC 标准,您会遇到另一种类型的数据单元,称为访问单元。访问单元是 NAL 单元的集合(因此是切片的集合)。在传输期间,分隔符放置在 NAL 单元之间以及访问单元之间,以便分别识别每种类型。在 HEVC 编码流中,访问单元分隔符定义为 x00 00 00 01,而 NAL 单元分隔符定义为 x00 00 01。因此,基本上,如果您想在给定帧中引入丢包,首先您需要识别正确的通过计算比特流中的访问单元分隔符来计算帧。稍后删除所需 NAL 单元分隔符之间的所有位。如果您研究 HEVC 标准,您会遇到另一种类型的数据单元,称为访问单元。访问单元是 NAL 单元的集合(因此是切片的集合)。在传输期间,分隔符放置在 NAL 单元之间以及访问单元之间,以便分别识别每种类型。在 HEVC 编码流中,访问单元分隔符定义为 x00 00 00 01,而 NAL 单元分隔符定义为 x00 00 01。因此,基本上,如果您想在给定帧中引入丢包,首先您需要识别正确的通过计算比特流中的访问单元分隔符来计算帧。稍后删除所需 NAL 单元分隔符之间的所有位。如果您研究 HEVC 标准,您会遇到另一种类型的数据单元,称为访问单元。访问单元是 NAL 单元的集合(因此是切片的集合)。在传输期间,分隔符放置在 NAL 单元之间以及访问单元之间,以便分别识别每种类型。在 HEVC 编码流中,访问单元分隔符定义为 x00 00 00 01,而 NAL 单元分隔符定义为 x00 00 01。因此,基本上,如果您想在给定帧中引入丢包,首先您需要识别正确的通过计算比特流中的访问单元分隔符来计算帧。稍后删除所需 NAL 单元分隔符之间的所有位。在传输期间,分隔符放置在 NAL 单元之间以及访问单元之间,以便分别识别每种类型。在 HEVC 编码流中,访问单元分隔符定义为 x00 00 00 01,而 NAL 单元分隔符定义为 x00 00 01。因此,基本上,如果您想在给定帧中引入丢包,首先您需要识别正确的通过计算比特流中的访问单元分隔符来计算帧。稍后删除所需 NAL 单元分隔符之间的所有位。在传输期间,分隔符放置在 NAL 单元之间以及访问单元之间,以便分别识别每种类型。在 HEVC 编码流中,访问单元分隔符定义为 x00 00 00 01,而 NAL 单元分隔符定义为 x00 00 01。因此,基本上,如果您想在给定帧中引入丢包,首先您需要识别正确的通过计算比特流中的访问单元分隔符来计算帧。稍后删除所需 NAL 单元分隔符之间的所有位。首先,您需要通过计算比特流中的访问单元分隔符来识别正确的帧。稍后删除所需 NAL 单元分隔符之间的所有位。首先,您需要通过计算比特流中的访问单元分隔符来识别正确的帧。稍后删除所需 NAL 单元分隔符之间的所有位。