#video #ffmpeg #h.264 #x264 #libx264
Вопрос:
Как вы знаете ref
, параметр может задать количество предыдущих кадров, которые каждый P-кадр может использовать в качестве ссылок.
Мне нужно то же самое для B-кадров, но ref=1
это не работает для B-кадров.
Я имею в виду кадр ввода-вывода, который будет использоваться в качестве эталона только для B-кадров.
возможно ли это с помощью командной строки? или путем изменения следующей функции в исходном коде ?
static inline int reference_update( x264_t *h )
{
if( !h->fdec->b_kept_as_ref )
{
if( h->i_thread_frames > 1 )
{
x264_frame_push_unused( h, h->fdec );
h->fdec = x264_frame_pop_unused( h, 1 );
if( !h->fdec )
return -1;
}
return 0;
}
/* apply mmco from previous frame. */
for( int i = 0; i < h->sh.i_mmco_command_count; i )
for( int j = 0; h->frames.reference[j]; j )
if( h->frames.reference[j]->i_poc == h->sh.mmco[i].i_poc )
x264_frame_push_unused( h, x264_frame_shift( amp;h->frames.reference[j] ) );
/* move frame in the buffer */
x264_frame_push( h->frames.reference, h->fdec );
if( h->frames.reference[h->sps->i_num_ref_frames] )
x264_frame_push_unused( h, x264_frame_shift( h->frames.reference ) );
h->fdec = x264_frame_pop_unused( h, 1 );
if( !h->fdec )
return -1;
return 0;
}
Ответ №1:
Нет. B-кадр по определению двунаправленный, т. Е. он должен иметь по крайней мере 2 опорных кадра (один до и один после в порядке представления), в противном случае он вообще не имеет смысла и не будет отличаться от P-кадра.
Комментарии:
1. В потоке open-GOP после вырезания в I-кадре (не IDR) вы можете получить IBBPBB в порядке декодирования и BBIBBP в порядке представления, но в таком случае, если декодирование начинается с него, первые 2 B-кадра должны быть отброшены.
2. Еще один раз такой поток может быть вырезан, но эти B-кадры не поддаются декодированию (без артефактов и сокрытия ошибок). x264 также может кодировать open-GOP с
--open-gop
опцией. Покажите мне любой коммерческий кодер, который может закодировать его другим способом, и передайте образец, в котором эти B-кадры будут правильно декодироваться.3. Они не могут, это вы сказали, что это возможно. Самое большее, что они могут сделать, это, как я сказал, закодировать open-gop и вырезать первый GOP, т. Е. Как этот образец, закодированный x264: test.zip или зеркало
4. ДА. Я посмотрел на него. Он действительно использует шаблон I(DR)BBPBBP. После этого я перечитал спецификации H. 264 и обнаружил, что в нем написано
8.2.4.2.3 Initialization process for reference picture lists for B slices in frames
:When this process is invoked, there shall be at least one reference entry that is currently marked as "used for reference" (i.e., as "used for short-term reference" or "used for long-term reference") and is not marked as "non-existing".
Так что, похоже, действительно можно использовать одну и ту же систему отсчета как для RefPicList0, так и для RefPicList1.5. Но я не понимаю смысла таких B-кадров с точки зрения эффективности сжатия. Единственное, что для этого нужно, имхо,-это сохранить тот же неадаптивный шаблон фрейма с открытым исходным кодом в первом GOP, что и в следующих GOP.