Я использую x264 для сжатия видеопотока с веб-камеры с такими настройками:
x264_param_default_preset(¶m, "veryfast", "zerolatency");
param.i_threads = 1;
param.i_fps_den = 1;
param.b_annexb = 1;
param.i_keyint_max = 30;
param.rc.i_rc_method = X264_RC_CRF;
param.rc.f_rf_constant = 25;
param.rc.f_rf_constant_max = 35;
param.b_repeat_headers = 1;
x264_param_apply_profile(¶m, "baseline");
param.i_slice_max_size = X264_NAL_MAX_SIZE;
Я хотел бы вписать NAL в размер MTU, но если я установлю небольшой максимальный размер, поток будет разрушен — он будет случайным образом мигать между черным и белым с некоторыми подсказками исходного изображения на заднем плане. Чем больше max_size, тем менее вероятно, что поток будет разрушен. Итак, мой вопрос — можем ли мы иметь небольшие NALU и правильный поток видео?
UPD: я использую FFmpeg в качестве декодера.
Проблема на самом деле не была с x264. Я предположил, что с x264 все в порядке и проверил все остальные части конвейера. Проблема была в том, что я обычно отправлял NAL по сети на декодер avcodec, что точно не может быть обработан декодером (объяснение). Мне понадобилось время, чтобы понять это.
Как только я скомпоновал блоки NAL в исходные группы, основанные на тех же кадрах, проблема исчезла. Это также объясняет, почему проблему легче воспроизвести с помощью комбинации небольших NAL и большого количества перемещений — она вызвала множество отдельных NAL, которые avcodec не смог правильно декодировать.
Других решений пока нет …