LINUX.ORG.RU

Захват видео из своей программы

 , ,


0

1

Добрый день всем! Подскажите, начал разбираться с OpenCV, получил кучу не понятных для себя проблем, основная - это не желание моей программы захватывать видео с IP-камеры по rtsp. Короче решил начать с более легкого, захват одного кадра и сохранение и захват потока по RTSP видео+аудио. Начал искать как можно это сделать, чаще всего встречаются gstreamer и снова OpenCV. Но насколько я понимаю, использовать в программе OpenCV только для захвата и сохранения видео это как пить из гидранта, избыточно. Следовательно остается только gstreamer, но что-то примеров как через него выполнить захват видео, я не нашел. Может кто подскажет как проще всего выполнить захват одного кадра и захват потокового видео, как это правильно делается, с чего начать?

Огромное спасибо всем, кто хотя-бы читал)))


Ответ на: комментарий от imb

А этот Live555, совершенно случайно, не закрытый проект? Что-то его практически нигде не упоминают. Или я плохо искал?

VladV ()
Ответ на: комментарий от VladV

Работал я с этим live555... Не переварил я его, помнится сделал через консольный GStreamer + ловил stdin/stdout.

I-Love-Microsoft ★★★★★ ()
Ответ на: комментарий от I-Love-Microsoft

а можно пример, я что-то никак не пойму с чего начать. Умом понимаю что мне нужно, наверное, открыть rtsp поток, считать его, например через read() и сохранить. Но по факту, даже не знаю с чего начать.

VladV ()
Ответ на: комментарий от VladV

Сначала просто из командной строки научиться выводить в окно (примеров в инете куча, гарантирую). Затем подменить последнюю стадию на fdsink, где можно указать stdout. А в своей программе открыть stdin.

Там куча вариантов, как сырой поток, как обернутый во фреймы.

Мой способ был нужен для хранения H264 потока (из RTSP) в файлах своего формата. Как моим способом сохранять в стандартные контейнеры, чтобы это всё еще считалось «захват из своей программы», не знаю.

Захват с какой целью? Отобразить? Мой способ мне подошел потому что я сыпал в свои файлы своего формата, а небольшой сжатый сырок поток распаковывал уже внутри своей программы через libav/ffmpeg - поэтому stdin/stdout мне подошел.

I-Love-Microsoft ★★★★★ ()
Ответ на: комментарий от I-Love-Microsoft

Спасибо! Захват с целью сохранить, а в дальнейшем, обработать. Но пока хочу самого простого, тупо сохранить без использования внешних программ типа VLC, и без гигантских библиотек типа OpenCV

VladV ()
Ответ на: комментарий от VladV

Захват с целью сохранить, а в дальнейшем, обработать

Ffmpeg умеет rtsp и сохранять,

ism ★★★ ()
Ответ на: комментарий от ism

Возможно глупый вопрос, но... Есть возможность как-то встроить в свою программу (С++), чтобы захват видео вызывать функцией(функцию написать)? Т.е. чтобы не делать что-то типа system(ffmpeg rtsp:// ......);. Сорри я нуб!)))

VladV ()
Ответ на: комментарий от VladV

Конечно есть такая возможность. Я тебя понимаю, ты нуб, хочется примера, но... увы, это не так чтоб тривиально. Тебе придется реально совершить трудовой подвиг и разобраться в этом самому.

Только на счет того что ffmpeg это может, я не уверен, возможно VLC ffmpeg GStreamer юзают как раз друг друга по цепочке, а в самом низу сидит live555. Так что как тебе будет проще и удобнее - тот путь и выбирай.

I-Love-Microsoft ★★★★★ ()
Последнее исправление: I-Love-Microsoft (всего исправлений: 1)
Ответ на: комментарий от I-Love-Microsoft

Спасибо за понимание)) Трудовой подвиг совершить я не против, просто каша в голове и не знаешь откуда начинать, тут действительно не понятно кто кого юзает и что за чем идет, что является «нормальным» для такой простой задачи, а что избыточным... Да и оказывается, что если не использовать сторонний софт, то задача не такая уж и простая))

VladV ()
Ответ на: комментарий от VladV

Может кто подскажет... Я наверное не совсем верно изначально начал эту тему. Зачем создавать свой велосипед свою программу, а точнее встраивать в нее код например ffmpeg, если можно шикарно юзать готовый ffmpeg, и не морочить себе яйца голову. Все это я затеял из-за необходимости сделать предзапись сюжета. Т.е. чтобы программа постоянно производила запись с камеры, а если есть событие, то сохраняла эту запись, ну как программы на телефонах, ручных видеокамерах, системах наблюдения. Например, камера пишет в буфер 30 секунд, каждые 30 секунд буфер обнуляется и в него снова происходит запись, все это длится до тех пор, пока не произойдет событие (пока программа не получит сигнал), если получен такой сигнал, программа не затирает буфер, а продолжает запись, например до 120 секунд, после чего все 120 секунд сохраняются в файл и цикл пошел сначала, таким образ я получаю съемку за несколько секунд до события.

Так вот, данную программу я написал, вот только буфером у меня выступает реальный файл на жестком диске и мне кажется, что это не совсем верное решение задачи)), исходя из это два вопроса:

  • Насколько такое решение заслуживает шанс на жизнь? Если все не так уж и плохо, тогда эта тема действительно не имеет смысла.
  • Возможно кто-то знает и, например, FFMPEG может делать выше описанное просто если запустить его с каким-то ключем или может есть специальная софтина для похожей задачи?

    Заранее благодарю!

VladV ()
Ответ на: комментарий от hizel

Спасибо за ответ! Но насколько я знаю motion выполняет предзахват, но только в виде картинок, т.е. не совсем то, что мне надо.

VladV ()
Ответ на: комментарий от VladV

Предзахват, wtf? motion умеет писать по событиям через ffmpeg видео.

hizel ★★★★★ ()
Ответ на: комментарий от hizel

Ой, сорри предзапись! Но в любом случае, нужно сделать запись до события, а не после

VladV ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.