v4l2 пример за заснемане на видео

това е първата ми публикация тук и се надявам да намеря малко помощ

Работя с вграден Linux на платка samsung ok6410 и ov9650 cmos камера

Трябва да заснема видеоклип и да го запазя на SD-карта

Искам да използвам кръгъл буфер, който улавя видео и когато е пълен, позволявам на новите данни да презапишат старите.

Има флаг, който при вдигане продължава 10 секунди, след което спира. Видеото, записано на sd-карта, трябва да съдържа 10 секунди преди вдигане на флага и 10 секунди след вдигане.

Прочетох примера за заснемане на официалния сайт на v4l2 API спецификации тук

http://free-electrons.com/kerneldoc/latest/video4linux/API.html

но има някои точки, които не мога да разбера или не знам дали ги разбирам правилно

  1. В този пример има 4 буфера за кадри, всеки буфер може да побере един кадър. Това вярно ли е?

  2. Има променлива (frame_count), която се инициализира на 70, това означава ли, че като завърша тази програма, ще имам видеоклип, който съдържа 70 кадъра?

  3. Какво правят fns (основен цикъл) и (рамка за четене)? Знам какво трябва да направят, но не мога да разбера писмения код, циклите... и т.н

  4. Как мога да коригирам fps в този код? или трябва да напиша стойността в регистрите на камерата?

  5. След като заснема видеоклипа, ще имам буфер, който е пълен със сурови данни, искам да го компресирам или да използвам кодеци, за да го запазя като MPEG, мога ли да променя формата на пикселите, който да бъде компресиран (MPEG например) вместо YUYV? или какво трябва да направя, за да компресирам видеото? кодеци или какво?

  6. Мога ли да запиша тези необработени данни в буфера във файл .yuv? Намерих софтуер, който може да възпроизвежда видеоклипове в този формат.

  7. Възможно ли е да се използват кръгови буфери вместо линейни буфери за задържане на заснетото видео?

Знам, че публикацията ми е твърде дълга, но съм начинаещ и не мога да намеря никакви уроци, които да ми помогнат да напиша своя код.

Благодаря предварително


person Rehab11    schedule 25.02.2012    source източник
comment
друга връзка от безплатни електрони: free-electrons.com/kerneldoc/latest/ DocBook/media_api/   -  person Peter Teoh    schedule 24.02.2013
comment
всички връзки са прекъснати   -  person ajayramesh    schedule 08.03.2018


Отговори (1)


Страницата, която свързвате, връща 404, но ако търсите документацията, трябва да проверите това http://linuxtv.org/downloads/v4l-dvb-apis/, по-специално проверете това example, което е добра отправна точка да направите това, което искате.

Тъй като мисля, че познах кода, за който говорите, опитвам се да отговоря на вашите въпроси

  1. 4-те кадрови буфера се използват за извършване на двойно буфериране, т.е. премахвате рамка от опашката и работите с нея, докато останалите се запълват от видео входа
  2. Ако е като в примера, който свързах, не, той просто грабва 70 кадъра от входа и след това излиза.
  3. read_frame премахва кадър от опашката от буфера, така че да можете да работите с него и го добавя отново към опашката, когато сте готови.
  4. за да настроите fps, трябва да извадите от опашката и да поставите отново в опашката кадри към драйверите, без да правите нищо. Промяната на fps се извършва чрез пропускане на кадри.
  5. най-общо казано, зависи от вашия драйвер и вашия енкодер. Трябва да намерите видео формат (като например V4L2_PIX_FMT_YUYV), който се поддържа както от драйвера, така и от енкодера. Ако не съществува, тогава трябва да напишете своя собствена рутина за преобразуване на цветовото пространство.
  6. Сигурен! Често правя това.
  7. Не разбирам въпроса.
person Ottavio Campana    schedule 07.03.2012