USB 카메라를 사용하여 일부 동영상을 녹화하려고 하는데 를 사용하는 데 문제가 있습니다 ffmpeg
.
을 실행하면 ffmpeg -f video4linux2 -t 00:00:10 -i /dev/video0 out.mpg
프로그램이 640x480에서 녹화를 시도하다가 ffmpeg
중단됩니다.
그런데 640x480(예: 320x240)보다 낮은 해상도로 추가해서 -s
녹화 ffmpeg
하면 동영상 녹화가 성공합니다.
일시 중지한 후 을 클릭하면 CTRL+C
ffmpeg가 다시 시작되어 크기가 0kB인 파일이 생성됩니다. 를 사용하면 장치에 대한 호출이 return 및 후속 return 을 유지하는 것을 strace
볼 수 있습니다 .ioctl
-EINVAL
ioctl
-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)
왜 이런 일이 발생하는지 아시나요?
저는 1.25에서 빌드된 ffmpeg
버전 2.8.7을 사용하고 있습니다. busybox
호스트 아키텍처는 커널 3.2를 실행하는 ARM 프로세서입니다.
소스에서 최신 버전을 컴파일해 보았지만 문제가 지속됩니다...
답변1
이유를 알아보세요: 트랜스코딩 및 원시 데이터 볼륨.
내 질문에 언급된 명령줄을 사용하여 원시 형식(yuv422)을 읽고 이를 mpeg-1로 트랜스코딩하고 있습니다 ffmpeg
. 카메라에서 스트리밍되는 데이터 양이 프로세서에 비해 너무 많습니다. 매달린 상태에서. 제가 사용하고 있는 카메라는 압축 형식(mjpeg)으로 스트리밍할 수도 있습니다. 이 형식으로 전환하면 ffmpeg
더 이상 끊김 현상이 발생하지 않고 15fps로 녹화할 수 있습니다.
그러나 mjpeg에서 mpeg-1로의 트랜스코딩 단계가 있습니다. 최종 트랜스코딩 단계를 제거하고 스트림을 복사하라고 지시 하여 ffmpeg
더 높은 fps 수를 달성할 수 있었습니다 .