Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: ffmpeg захват c firewire  (Прочитано 3516 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн gamber0k

  • Автор темы
  • Новичок
  • *
  • Сообщений: 8
    • Просмотр профиля
ffmpeg захват c firewire
« : 17 Февраля 2014, 12:13:43 »
День добрый, уважаемые!
Подскажите бедному юзеру как овладать захватом видео с помощью ffmpeg с камеры, подключенной по firewire?
Из того, что я нагуглил, из недавних пор для этого используется libiec61883, но инфы по ней ох как мало.
Камеру подключаю, появляется у меня /dev/fw0. После включения камеры появляется ещё /dev/fw1 с которого dvgrab захватывает видео без проблем, а вот ffmpeg никак не хочет. Кто-то имел дело с этим?
команда ffmpeg:
~# ffmpeg -threads 0 -f iec61883 -i auto -vcodec libx264 -pix_fmt yuv420p -acodec libfaac -ar 44100 -f flv rtmp://192.168.1.1/testapp/teststream
ffmpeg version git-2014-02-10-1c1bb20 Copyright (c) 2000-2014 the FFmpeg developers
  built on Feb 13 2014 08:44:16 with gcc 4.6 (Ubuntu/Linaro 4.6.3-1ubuntu5)
  configuration: --prefix=/home/gamber/ffmpeg_build --extra-cflags=-I/home/gamber/ffmpeg_build/include --extra-ldflags=-L/home/gamber/ffmpeg_build/lib --bindir=/home/gamber/bin --extra-libs=-ldl --enable-gpl --enable-libass --enable-libfdk-aac --enable-libmp3lame --enable-libopus --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-nonfree --enable-x11grab --enable-libfaac --enable-libdc1394 --enable-libiec61883
  libavutil      52. 63.101 / 52. 63.101
  libavcodec     55. 50.100 / 55. 50.100
  libavformat    55. 31.100 / 55. 31.100
  libavdevice    55.  8.100 / 55.  8.100
  libavfilter     4.  1.102 /  4.  1.102
  libswscale      2.  5.101 /  2.  5.101
  libswresample   0. 17.104 /  0. 17.104
  libpostproc    52.  3.100 / 52.  3.100
No more input data available
[iec61883 @ 0x9be7ea0] Could not find codec parameters for stream 0 (Unknown: none): unknown codec
Consider increasing the value for the 'analyzeduration' and 'probesize' options
Input #0, iec61883, from 'auto':
  Duration: N/A, start: 381.543600, bitrate: 384 kb/s
  Program 100
  No Program
    Stream #0:0: Unknown: none
    Stream #0:1: Video: mpeg2video (Main), yuv420p(tv, bt709), 1440x1080 [SAR 4:3 DAR 16:9], max. 25000 kb/s, 25 tbr, 90k tbn, 50 tbc
    Stream #0:2: Audio: mp2, 48000 Hz, stereo, s16p, 384 kb/s
[libx264 @ 0x9bfee20] using SAR=4/3
[libx264 @ 0x9bfee20] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX
[libx264 @ 0x9bfee20] profile High, level 4.0
[libx264 @ 0x9bfee20] 264 - core 142 r2 956c8d8 - H.264/MPEG-4 AVC codec - Copyleft 2003-2014 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=6 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
Output #0, flv, to 'rtmp://192.168.1.1/testapp/teststream':
  Metadata:
    encoder         : Lavf55.31.100
    Stream #0:0: Video: h264 (libx264) ([7][0][0][0] / 0x0007), yuv420p, 1440x1080 [SAR 4:3 DAR 16:9], q=-1--1, 1k tbn, 25 tbc
    Stream #0:1: Audio: aac (libfaac) ([10][0][0][0] / 0x000A), 44100 Hz, stereo, s16, 128 kb/s
Stream mapping:
  Stream #0:1 -> #0:0 (mpeg2video -> libx264)
  Stream #0:2 -> #0:1 (mp2 -> libfaac)
Press [q] to stop, [?] for help
auto: Operation not permitted
[flv @ 0x9bfe6e0] Failed to update header with correct duration.
[flv @ 0x9bfe6e0] Failed to update header with correct filesize.
frame=    1 fps=0.0 q=28.0 Lsize=      19kB time=00:00:00.32 bitrate= 482.1kbits/s
video:16kB audio:2kB subtitle:0 data:0 global headers:0kB muxing overhead 2.683706%
[libx264 @ 0x9bfee20] frame I:1     Avg QP:21.87  size: 16012
[libx264 @ 0x9bfee20] mb I  I16..4: 25.3% 74.3%  0.4%
[libx264 @ 0x9bfee20] 8x8 transform intra:74.3%
[libx264 @ 0x9bfee20] coded y,uvDC,uvAC intra: 29.5% 70.8% 1.0%
[libx264 @ 0x9bfee20] i16 v,h,dc,p: 47% 29% 19%  5%
[libx264 @ 0x9bfee20] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 45% 13% 33%  2%  1%  2%  2%  1%  1%
[libx264 @ 0x9bfee20] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 66%  8% 19%  1%  2%  1%  2%  0%  0%
[libx264 @ 0x9bfee20] i8c dc,h,v,p: 52% 24% 23%  2%
[libx264 @ 0x9bfee20] kb/s:3202.40
Если в качестве источника подсунуть что-то другое, то все проходит нормально. С той же вебки через v4l2 захватывает без проблем.
root@gamber:~# uname -a
Linux gamber 3.8.0-29-generic #42~precise1-Ubuntu SMP Wed Aug 14 15:31:16 UTC 2013 i686 i686 i386 GNU/Linux
root@gamber:~# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 12.04.3 LTS
Release:        12.04
Codename:       precise

Оффлайн arch!ver

  • Старожил
  • *
  • Сообщений: 1260
    • Просмотр профиля
Re: ffmpeg захват c firewire
« Ответ #1 : 17 Февраля 2014, 15:22:50 »
gamber0k,
Ох и мутная это тема, уважаемый...

Если в качестве источника подсунуть что-то другое, то все проходит нормально. С той же вебки через v4l2 захватывает без проблем.

Так насколько я понимаю, то интерфейс v4l2 который иcпользуется в FFmpeg и создан для захвата с камер: How to capture a webcam input
Для захвата видео с цифровой камеры подключенной по FireWire или USB— dvgrab
« Последнее редактирование: 17 Февраля 2014, 15:41:14 от archiver »

Оффлайн gamber0k

  • Автор темы
  • Новичок
  • *
  • Сообщений: 8
    • Просмотр профиля
Re: ffmpeg захват c firewire
« Ответ #2 : 17 Февраля 2014, 15:56:26 »
Ну из того что я понял, v4l2 для юсб-камер, а для захвата с firewire ffmpeg'ом используется libiec61883.
Да и нету уже /dev/raw1394. Сейчас уже принцип поменялся:
Цитировать
This is the default DV/HDV input method in Linux Kernel 2.6.37 and later, since the old FireWire stack was removed.
dvgrab то у меня работает, только мне нужно хватать видео с камеры, сжимать его и отдавать в rtmp. dvgrab разве это умеет?

Оффлайн arch!ver

  • Старожил
  • *
  • Сообщений: 1260
    • Просмотр профиля
Re: ffmpeg захват c firewire
« Ответ #3 : 17 Февраля 2014, 16:01:46 »
Ну из того что я понял, v4l2 для юсб-камер, а для захвата с firewire ffmpeg'ом используется libiec61883.
Значит скорее всего у вас строка не правильно оформлена - ищите ошибки...

Could not find codec parameters for stream 0 (Unknown: none): unknown codec

***

Stream #0:0: Unknown: none
Stream #0:1: Video: mpeg2video (Main), yuv420p(tv, bt709), 1440x1080 [SAR 4:3 DAR 16:9], max. 25000 kb/s, 25 tbr, 90k tbn, 50 tbc
Stream #0:2: Audio: mp2, 48000 Hz, stereo, s16p, 384 kb/s

Stream #0:0: - Должно быть Видео или заголовок с обозначением использованных кодеков
« Последнее редактирование: 17 Февраля 2014, 16:46:39 от archiver »

Оффлайн Lego777

  • Любитель
  • *
  • Сообщений: 79
  • Puppyrus user
    • Просмотр профиля
Re: ffmpeg захват c firewire
« Ответ #4 : 17 Февраля 2014, 16:11:48 »
Для захвата через firewire нужен dvgrab. Если непременно консольно - примерно так:
#!/bin/sh
urxvt -e dvgrab --autosplit --format dv2 --size 0 --opendml  videofile-
(с поправками применительно Ubuntu, как-то название терминала и необходимость sudo)

Оффлайн arch!ver

  • Старожил
  • *
  • Сообщений: 1260
    • Просмотр профиля
Re: ffmpeg захват c firewire
« Ответ #5 : 17 Февраля 2014, 16:13:37 »
Lego777,
Про dvgrab и так ясно, но вопрос стоит - захват средствами FFmpeg...

gamber0k,
Здесь ещё посмотрите iec61883
« Последнее редактирование: 17 Февраля 2014, 16:37:51 от archiver »

Оффлайн gamber0k

  • Автор темы
  • Новичок
  • *
  • Сообщений: 8
    • Просмотр профиля
Re: ffmpeg захват c firewire
« Ответ #6 : 17 Февраля 2014, 16:31:45 »
Для захвата через firewire нужен dvgrab. Если непременно консольно - примерно так:
#!/bin/sh
urxvt -e dvgrab --autosplit --format dv2 --size 0 --opendml  videofile-
(с поправками применительно Ubuntu, как-то название терминала и необходимость sudo)
dvgrab у меня работает, но как отдать захваченное dvgrab'ом видео в rtmp?


gamber0k,
Здесь ещё посмотрите iec61883
Здесь смотрел, оттуда и цитату давал, но тут слишком мало инфы. По поводу Stream #0:0: так у меня их появляется и больше. каждый раз по разному. Бывает и 5 шт появится, из которых 2 рабочих (аудио и видео) а остальные пустыж вроде этого Stream #0:0:
Действительно мутная тема :(

Оффлайн arch!ver

  • Старожил
  • *
  • Сообщений: 1260
    • Просмотр профиля
Re: ffmpeg захват c firewire
« Ответ #7 : 17 Февраля 2014, 16:37:43 »
Здесь смотрел, оттуда и цитату давал, но тут слишком мало инфы.
Там как минимум указано дополнительно: - опции и буфер, - которые у вас в строке совсем не указаны... К тому же у вас в строке нет директории вывода, - не знаю но это может стать причиной неработоспособности командного кода...
<dvtype>
Перекрыть автоопределение DV / HDV. Это должно использоваться только тогда, когда автоматическое определение не работает, или если использование другого типа устройства должны быть запрещены. Лечение DV устройство в качестве HDV (или наоборот) не будет работать и может привести к непредсказуемым последствиям. Значения «авто», «DV» и «HDV 'поддерживаются.

/dev/fw1/videoout.flvа потому уже следующая операция:
ffmpeg -i /dev/fw1/videoout.flv rtmp://192.168.1.1/testapp/teststreamПробуйте разные варианты - ошибка где то в сставлении строки... Я проверить не смогу, - у меня нет DV-камеры...

dvgrab у меня работает, но как отдать захваченное dvgrab'ом видео в rtmp?
Захватывать dvgrab'ом - а раздавать ffmpeg`ом
« Последнее редактирование: 17 Февраля 2014, 16:49:32 от archiver »

Оффлайн gamber0k

  • Автор темы
  • Новичок
  • *
  • Сообщений: 8
    • Просмотр профиля
Re: ffmpeg захват c firewire
« Ответ #8 : 17 Февраля 2014, 16:49:14 »
Там как минимум указано дополнительно: - опции и буфер, - которые у вас в строке совсем не указаны... К тому же у вас в строке нет директории вывода, - не знаю но это может стать причиной неработоспособности командного кода...
/dev/fw1/videoout.flv
Вывод происходит в rtmp поток, а именно в rtmp://192.168.1.1/testapp/teststream
/dev/fw1 это не вывод, а это устройство ввода, она же камера, подключенная по firewire.
По поводу hdvbuffer у меня вообще матерится на эту опцию, если я её добавляю: Unrecognized option 'hdvbuffer'

Оффлайн arch!ver

  • Старожил
  • *
  • Сообщений: 1260
    • Просмотр профиля
Re: ffmpeg захват c firewire
« Ответ #9 : 17 Февраля 2014, 16:50:03 »
gamber0k,
Можно подмать что буфер - там единственная из опций :)

26.6.1 Options
<dvtype>
Перекрыть автоопределение DV / HDV. Это должно использоваться только тогда, когда автоматическое определение не работает, или если использование другого типа устройства должны быть запрещены. Лечение DV устройство в качестве HDV (или наоборот) не будет работать и может привести к непредсказуемым последствиям. Значения «авто», «DV» и «HDV 'поддерживаются.

Если FFmprg заявил о работоспособности данного контента - то стало быть он работает... Нужно искать причину неработоспособности строки, - ошибку... Чаще всего ошибки бывают незаметными или ложно интерпретируются как "правильные" установки...

Вывод происходит в rtmp поток, а именно в rtmp://192.168.1.1/testapp/teststream
А вы уверенны в том что ffmpeg способен это делать именно непрерывно и именно в таком синтаксисе? Может для этого нужно указать какие то дополнительные параметры и временные директории для кэширования кодируемого материала на HDD...

По поводу hdvbuffer у меня вообще матерится на эту опцию, если я её добавляю: Unrecognized option 'hdvbuffer'
А вы уверены что вы её правильно установили (прописали) - dvbuffer, hdvbuffer - по моему не спроста эти названия различаются...
FireWire DV/HDV input device using libiec61883:
HDV
DV
А формат вашего входного видео, как я понял - MPEG2

К тому же:
No more input data available
[iec61883 @ 0x9be7ea0] Could not find codec parameters for stream 0 (Unknown: none): unknown codec
Нет доступных входных данных.
Не удалось найти параметры кодеков для stream 0... Может их стоит установить? Или это проблема с определением типа видео, которая озвучена выше...
« Последнее редактирование: 17 Февраля 2014, 17:33:30 от archiver »

Оффлайн gamber0k

  • Автор темы
  • Новичок
  • *
  • Сообщений: 8
    • Просмотр профиля
Re: ffmpeg захват c firewire
« Ответ #10 : 17 Февраля 2014, 17:53:32 »
Все опции которые там указаны я пробовал прописать принудительно. Эффект не изменился.
По поводу rtmp: в этом проблем не было замечено, т.к. я указывал разные источники, в т.ч. из вебки через v4l2 и все работает, отдается по rtmp без проблем.
Цитировать
Если FFmprg заявил о работоспособности данного контента - то стало быть он работает... Нужно искать причину неработоспособности строки, - ошибку... Чаще всего ошибки бывают незаметными или ложно интерпретируются как "правильные" установки...
Это и тешит мои надежды. :)
Цитировать
FireWire DV/HDV input device using libiec61883:
HDV
DV
А формат вашего входного видео, как я понял - MPEG2
The libiec61883 library provides a higher level API for streaming DV, MPEG-2 and audio over Linux IEEE 1394. This includes both reception and transmission. It uses the new "rawiso" API of libraw1394

Что мне больше всего не понятно, так это количество потоков. Оно каждый раз разное... должно быть только 2 с аудио и видео, а оно колеблется от 2 до 5 и все остальные  кроме видео и аудио пустые... Не пойму откуда они :(

Оффлайн gamber0k

  • Автор темы
  • Новичок
  • *
  • Сообщений: 8
    • Просмотр профиля
Re: ffmpeg захват c firewire
« Ответ #11 : 17 Февраля 2014, 18:35:07 »
Выхлоп с опцией debug:
matched as AVOption 'debug' with argument '-f'.
Reading option 'iec61883' ... matched as output file.
Reading option '-i' ... matched as input file with argument 'auto'.
Reading option '-ar' ... matched as option 'ar' (set audio sampling rate (in Hz)) with argument '44100'.
Reading option '-f' ... matched as option 'f' (force format) with argument 'flv'.
Reading option 'rtmp://192.168.1.1/testapp/teststream' ... matched as output file.
Finished splitting the commandline.
Parsing a group of options: global .
Successfully parsed a group of options.
Parsing a group of options: input file auto.
Successfully parsed a group of options.
Opening an input file: auto.
auto: No such file or directory
Похоже, он не понимает что я имею ввиду под входным девайсом. Он думает что я ему подсунул в качестве входа файл с именем auto, а в качестве выхода указываю libiec61883 :idiot2:
« Последнее редактирование: 17 Февраля 2014, 18:43:14 от gamber0k »

Оффлайн arch!ver

  • Старожил
  • *
  • Сообщений: 1260
    • Просмотр профиля
Re: ffmpeg захват c firewire
« Ответ #12 : 17 Февраля 2014, 18:39:28 »
Похоже, он не понимает что я имею ввиду под входным девайсом. Он думает что я ему подсунул в качестве входа файл с именем auto, а в качестве выхода указываю libiec61883 :idiot2:
У вас неправильно оформлена строка, как я и сказал выше... FFmpeg вас не понимает :idiot2: ;)

gamber0k,
Укажите принудительно потоки вашего видео...
ffmpeg -f iec61883 -i auto -vcodec libx264 -profile main -acodec libfaac -ar 44100 -map 0:0 -map 0:1 -f flv rtmp://192.168.1.1/testapp/teststream
И не ставте на входе ключ threads - это чревато...

Оффлайн gamber0k

  • Автор темы
  • Новичок
  • *
  • Сообщений: 8
    • Просмотр профиля
Re: ffmpeg захват c firewire
« Ответ #13 : 17 Февраля 2014, 18:49:29 »
Да, действительно. Неправильно указал опцию дебага.
Теперь все ок.
На предложенные Вами опции map выдает ошибку
Cannot map stream #0:0 - unsupported type.


Оффлайн arch!ver

  • Старожил
  • *
  • Сообщений: 1260
    • Просмотр профиля
Re: ffmpeg захват c firewire
« Ответ #14 : 17 Февраля 2014, 18:50:49 »
На предложенные Вами опции map выдает ошибку
Cannot map stream #0:0 - unsupported type.
Теперь пробуйте то же самое но без - map
« Последнее редактирование: 17 Февраля 2014, 19:26:35 от archiver »

 

Страница сгенерирована за 0.043 секунд. Запросов: 25.