Зависание / замораживание записи звука во время вызовов v4l2 VIDIOC_QBUF

#c #linux #raspberry-pi #alsa #v4l2

#c #linux #raspberry-pi #alsa #v4l2

Вопрос:

Я пытаюсь записать звук с помощью ALSA asound video через v4l2 на raspberry pi, и по отдельности это работает нормально. Но в то же время некоторые звуковые кадры теряются во время вызова ioctl VIDIOC_QBUF:

 ioctl(fd, VIDIOC_QBUF, amp;bufferinfo[i])
  

и захват звука с

 snd_pcm_readi (capture_handle, input_buffer_audio, audio_frames)
  

На каждом VIDIOC_QBUF snd_pcm_readi отключается / зависает около ~ 300 аудиокадров. Я также пытался вызвать захват звука и видео в отдельных тестовых приложениях, работающих на RPi, проблема также повторилась в этом случае.
Я не вижу перегрузки процессора или чего-то еще, указывающего на проблему (нагрузка ниже < 12% на моем RPi 3b). И проблема не воспроизводится на ПК с Linux со стеком ALSA v4l2 с той же камерой (logitech c270).

На камере с частотой 30 кадров в секунду это большая проблема, потому что такие большие незакрепленные кадры делают звук запаздывающим.

Комментарии:

1. Вероятно, вам придется показать немного больше вашего кода и структуры вашей программы. Вы записываете аудио и видео в разных потоках?

2. Да, в другом. Но это не имеет значения, даже если запись звука и видео разделены для каждой отдельной программы, вызов VIDIOC_QBUF из видеозахвата будет иметь такой же эффект замедления для другого процесса с захватом звука, и я вижу потери кадров. Я попытаюсь сделать небольшой тестовый пример.

3. Являются ли ваши вызовы (ioctl, snd_pcm_readi ) блокирующими или неблокирующими? Я бы попробовал неблокирующий. Я подозреваю, что какой-то общесистемный ресурс блокируется.

4. Мои первоначальные мысли также о каком-то системном заблокированном ресурсе, который недоступен во время запроса на заполнение очереди кадров. Вероятно, оба являются блокирующими (без каких-либо неблочных опций, переданных сейчас или что-то в этом роде). Но странно, что это проблема только с RPi и не воспроизводится на моем ноутбуке Linux / fedora.

5. Вероятно, это ошибка или ограничение в драйвере ядра V4L и / или ALSA, специфичном для Pi.