我正在使用RTP传输H.264(libx264)视频。我想比较h.264中的不同错误恢复方法。在一些研究论文中,psnr用于比较它们。所以我想知道如何在流媒体中计算h.264视频的psnr。
答案 0 :(得分:1)
要计算PSNR,您必须比较两个帧,因此,首先要确保您拥有源视频的副本,接下来您必须能够匹配帧1:1。因此,如果帧被下垂,则需要将源帧与上一个流帧进行比较。如果时间戳不匹配,则可能很难(它们可能被RTP服务器修改)。接下来将每个帧解码为其YUV通道。通道的PSNR需要独立计算。您可以在最后平均三个PSNR值,但这会对U,V通道造成太大的影响。我建议只使用Y通道,因为它是最重要的。并且感觉到你正在测量数据包丢失,无论如何,这些值将是强相关的。
接下来计算你的均方误差如下:
int64_t mse = 0;
for(int x = 0 ; x < frame.width ; ++x ) {
for(int y = 0 ; y < frame.height ; ++y ) {
mse += pow( source_frame[x][y] - streamed_frame[x][y], 2 );
}}
mse = 1.0/(frame.width*frame.height);
最后:
/* use 219 instead of 255 if you know your colorspace is BT.709 */
double psnr = 20 * log2l( 255 ) - 10 * log2l( mse );
您可以将每帧PSNR平均在一起以获得完整的流PSNR。