Без открытия устройства V4L2:
Без открытия устройства V4L2:

С открытием V4L2 устройство:

Интересно, что значительное количество вызовов функций приходится на временной интервал ~25 мс! Но большинство из них занимают ~78 мс... почему?
Я добавил следующий блок кода в основную функцию примера, и все, что нужно для запуска это замедление — вызов avformat_open_input! Мне не нужно читать кадры из ввода, достаточно просто открыть их.
Код: Выделить всё
//codec = avcodec_find_decoder(AV_CODEC_ID_MPEG1VIDEO);
codec = avcodec_find_decoder(AV_CODEC_ID_MJPEG); // Replace the example MPEG1 with MJPEG
// ...
avdevice_register_all();
auto* inputFormat = av_find_input_format("v4l2");
AVDictionary* options = nullptr;
av_dict_set(&options, "input_format", "mjpeg", 0);
av_dict_set(&options, "video_size", "1920x1080", 0);
AVFormatContext* fmtCtx = nullptr;
// Commenting this line out results in fast encoding!
avformat_open_input(&fmtCtx, "/dev/video0", inputFormat, &options);
// ... do while loop to parse packets from the file and decode them ...
Кроме того, если я попытаюсь запустить, казалось бы, эквивалентный конвейер через сам инструмент ffmpeg, я не столкнусь с этой проблемой. Запуск этой команды:
Код: Выделить всё
ffmpeg -f v4l2 -input_format mjpeg -video_size 1920x1080 -r 30 -c:v mjpeg -i /dev/video0 -c:v copy out.mjpeg
Код: Выделить всё
[mjpeg @ 0x5590d6b7b0] Application provided invalid, non monotonically increasing dts to muxer in stream 0: 27 >= 27
[mjpeg @ 0x5590d6b7b0] Application provided invalid, non monotonically increasing dts to muxer in stream 0: 30 >= 30
...
Подробнее здесь: https://stackoverflow.com/questions/791 ... put-device
Мобильная версия