【问题标题】:PSNR calculation in H.264 packet lossH.264丢包中的PSNR计算
【发布时间】:2020-11-07 09:09:27
【问题描述】:

我正在使用 RTP 流式传输 H.264(libx264) 视频。我想比较 h.264 中不同的错误恢复方法。在一些研究论文中,psnr被用来比较它们。所以我想知道如何在流式传输期间计算 h.264 视频的 psnr。

【问题讨论】:

    标签: h.264 x264 packet-loss


    【解决方案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 * log10( 255 ) - 10 * log10( mse );
    

    您可以将每帧的 PSNR 平均在一起,以获得完整的流 PSNR。

    【讨论】:

    • 有些帧不携带噪音或噪音可以忽略不计(mse 非常小)。那么要计算平均 psnr ,我们还需要包括那些帧的 psnr 吗?
    • 我不知道您的设置,但这取决于您要测量的内容。一种“错误恢复方法”可能会通过整体降级流来在单个帧上做得更好,反之亦然。您想知道每帧错误还是随时间变化的错误?
    猜你喜欢
    • 2014-05-06
    • 1970-01-01
    • 1970-01-01
    • 2013-03-06
    • 2013-11-07
    • 1970-01-01
    • 2012-12-29
    • 1970-01-01
    • 2022-01-19
    相关资源
    最近更新 更多