ffmpeg зависает при попытке записать видео в более высоком разрешении

ffmpeg зависает при попытке записать видео в более высоком разрешении

Я пытаюсь записать видео с помощью USB-камеры, но у меня возникают некоторые проблемы при использовании ffmpeg.

Если я запускаю ffmpeg -f video4linux2 -t 00:00:10 -i /dev/video0 out.mpg, программа пытается записать с разрешением 640x480 и ffmpegзависает.

Однако если я добавлю -sи ffmpegначну запись с разрешением ниже 640x480 (например, 320x240), видео запишется успешно.

После зависания, если я нажимаю CTRL+C, ffmpeg возобновляет работу, выдавая файл размером 0 кБ. Используя straceя могу видеть, что ioctlвызов устройства сохраняет возвраты -EINVALи последующие ioctls возвращают -EAGAIN.

ioctl(3, VIDIOC_G_STD, 0xbe84dfb0)      = -1 EINVAL (Invalid argument)
ioctl(3, VIDIOC_DQBUF, {type=V4L2_BUF_TYPE_VIDEO_CAPTURE}) = -1 EAGAIN (Resource temporarily unavailable)

Есть идеи, почему это происходит?

Я использую ffmpegверсию 2.8.7, построенную через busybox1.25. Архитектура хоста — процессор ARM с ядром 3.2.

Я также попробовал скомпилировать последнюю версию из исходного кода, но проблема осталась...

решение1

Разобрался в причине: перекодировка и объем необработанных данных.

Используя командную строку, упомянутую в моем вопросе, я считывал из формата raw (yuv422) и перекодировал его в mpeg-1, который был кодировкой по умолчанию для моей версии ffmpeg. Объем данных, передаваемых с камеры, был просто слишком большим для процессора, что приводило к зависанию. Камера, которую я использовал, могла также транслировать в сжатом формате (mjpeg). Переключившись на этот формат, ffmpegзависания больше не было, и я мог записывать со скоростью 15 кадров в секунду.

Однако был шаг перекодирования, из mjpeg в mpeg-1. Мне удалось достичь более высокого количества кадров в секунду, указав ffmpegкопировать поток, удалив последний шаг перекодирования.

Связанный контент