Я транслирую видео H.264 (libx264) с использованием RTP. Я хотел бы сравнить различные методы защиты от ошибок в h.264. В некоторых исследовательских работах для их сравнения использовался psnr. Поэтому я хотел бы знать, как рассчитать psnr видео h.264 во время потоковой передачи.
Расчет PSNR при потере пакетов H.264
Ответы (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 для полного потока.