LINUX.ORG.RU

Рассинхронизация аудио и видео потока

 


4

2

Делаю скринкаст в реальном времени при помощи ffmpeg

ffmpeg -f x11grab -s 955x538 -i :0.0+60,124+nomouse -f alsa -i hw:Loopback,1,0 -f alsa -i hw:0,0 -filter_complex amix -ar 44100 -acodec libmp3lame -r 15 -qscale 0 -f flv test.flv 

Проблема в заголовке темы, звук постоянно отстает, если, допустим, показывать какой-нибудь ролик.

Версия ffmpeg-1.2.4 Дистр - gentoo

Есть ли решение, кто сталкивался? Помогите, пожалуйста

Проследи, с какой скоростью тикают часы в трее на скринкасте. Если с неправильной скоростью - то x11grab штампит кадры неправильно. Конкретно, по моему мнению, это из-за того, что x11grab якобы делает кадры с определённой дефолтной частотой, а по факту отклоняется от этой частоты - не успевает, типа. Чтобы стало правильно, надо видео-таймштампы поменять на фактические, из системного времени. Добавить нужно что-то типа

-filter:v setpts='(RTCTIME - RTCSTART) / (TB * 1000000)'

У меня также обычно имело место несовпадение звука и изображения на постоянную величину. Тут можно определять опытным путём и вручную задавать смещение тем же setpts. Также мне помогало задание опции -tune zerolatency для кодека libx264.

http://ffmpeg.org/ffmpeg-filters.html#setpts_002c-asetpts

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

Думаю, просто видео и аудио кодируются с разной скоростью и ffmpeg на выводе этого не учитывает.

Спасибо за совет с таймштампами, обязательно буду смотреть и пробовать.

acroobat
() автор топика

Покажи вывод ffmpeg.

Предположу, что с альсы звук берется с частотой 48кГц, а запись идет с 44100 Гц без преобразования. Тогда надо добавить фильтр aresample.

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

Похоже, ты верно предположил. Буду пробовать с добавлением фильтра, спасибо. А вот вывод:

ffmpeg -f x11grab -s 955x538 -i :0.0+60,124+nomouse -f alsa -i hw:Loopback,1,0 -f alsa -i hw:0,0 -filter_complex amix -ar 44100 -filter:a asetpts=N/SR/TB -acodec libmp3lame -filter:a aresample=44100 -r 15 -qscale 0 -f flv test.flv
ffmpeg version 1.2.4 Copyright (c) 2000-2013 the FFmpeg developers
  built on Oct 18 2013 10:44:35 with gcc 4.5.4 (Gentoo 4.5.4 p1.0, pie-0.4.7)
  configuration: --prefix=/usr --libdir=/usr/lib64 --shlibdir=/usr/lib64 --mandir=/usr/share/man --enable-shared --cc=x86_64-pc-linux-gnu-gcc --cxx=x86_64-pc-linux-gnu-g++ --ar=x86_64-pc-linux-gnu-ar --optflags='-march=native -O2 -pipe' --extra-cflags='-march=native -O2 -pipe' --extra-cxxflags='-march=native -O2 -pipe' --disable-static --enable-gpl --enable-postproc --enable-avfilter --enable-avresample --disable-stripping --enable-version3 --disable-indev=oss --disable-indev=jack --disable-outdev=oss --disable-outdev=sdl --enable-bzlib --disable-runtime-cpudetect --disable-debug --disable-doc --disable-gnutls --enable-hardcoded-tables --enable-iconv --enable-network --disable-openssl --disable-ffplay --enable-vaapi --disable-vdpau --enable-zlib --enable-libvo-aacenc --disable-libvo-amrwbenc --enable-libmp3lame --disable-libfdk-aac --disable-libaacplus --disable-libfaac --enable-libtheora --disable-libtwolame --enable-libx264 --disable-libxvid --disable-libcdio --disable-libiec61883 --disable-libdc1394 --dis  libavutil      52. 18.100 / 52. 18.100
  libavcodec     54. 92.100 / 54. 92.100
  libavformat    54. 63.104 / 54. 63.104
  libavdevice    54.  3.103 / 54.  3.103
  libavfilter     3. 42.103 /  3. 42.103
  libswscale      2.  2.100 /  2.  2.100
  libswresample   0. 17.102 /  0. 17.102
  libpostproc    52.  2.100 / 52.  2.100
[x11grab @ 0x8308d0] 'nomouse' specification in argument is deprecated: use 'draw_mouse' option with value 0 instead
[x11grab @ 0x8308d0] device: :0.0+60,124+nomouse -> display: :0.0 x: 60 y: 124 width: 955 height: 538
[x11grab @ 0x8308d0] shared memory extension found
[x11grab @ 0x8308d0] Estimating duration from bitrate, this may be inaccurate
Input #0, x11grab, from ':0.0+60,124+nomouse':
  Duration: N/A, start: 1382501676.184578, bitrate: 492745 kb/s
    Stream #0:0: Video: rawvideo (BGR[0] / 0x524742), bgr0, 955x538, 492745 kb/s, 29.97 tbr, 1000k tbn, 29.97 tbc
[alsa @ 0x83d5b0] Estimating duration from bitrate, this may be inaccurate
Guessed Channel Layout for  Input Stream #1.0 : stereo
Input #1, alsa, from 'hw:Loopback,1,0':
  Duration: N/A, start: 1382501676.197919, bitrate: 1536 kb/s
    Stream #1:0: Audio: pcm_s16le, 48000 Hz, stereo, s16, 1536 kb/s
[alsa @ 0x83e570] Estimating duration from bitrate, this may be inaccurate
Guessed Channel Layout for  Input Stream #2.0 : stereo
Input #2, alsa, from 'hw:0,0':
  Duration: N/A, start: 1382501676.202399, bitrate: 1536 kb/s
    Stream #2:0: Audio: pcm_s16le, 48000 Hz, stereo, s16, 1536 kb/s
Please use -q:a or -q:v, -qscale is ambiguous
File 'test.flv' already exists. Overwrite ? [y/N] y
Output #0, flv, to 'test.flv':
  Metadata:
    encoder         : Lavf54.63.104
    Stream #0:0: Audio: mp3 ([2][0][0][0] / 0x0002), 44100 Hz, stereo, fltp
    Stream #0:1: Video: flv1 ([2][0][0][0] / 0x0002), yuv420p, 955x538, q=2-31, 200 kb/s, 1k tbn, 15 tbc
Stream mapping:
  Stream #1:0 (pcm_s16le) -> amix:input0 (graph 0)
  Stream #2:0 (pcm_s16le) -> amix:input1 (graph 0)
  amix (graph 0) -> Stream #0:0 (libmp3lame)
  Stream #0:0 -> #0:1 (rawvideo -> flv)
acroobat
() автор топика
Ответ на: комментарий от acroobat

Фильтр не собрался. Надо попроще:

-af "amix, aresample=48000"
вместо всех "-filter*"

Зачем «asetpts=N/SR/TB»? Играть временем здесь не надо.

И частота кадров не согласована. По умолчанию x11grab дает чуть меньше 30 Гц (т.е. NTCS), а в файл пишешь 15 Гц. Надо задать частоту захвата кадров:

... -s 955x538 -framerate 15 -i :0.0...

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

Помогло, проблема с рассинхронизацией решена. Спасибо огромное.

Правда, прошу помочь еще с одним вопросом. Хочу добавить вебкамеру в угол экрана оверлеем. Проблема - на выходе дает 1fps.

ffmpeg собирал без поддержки libv4l, вебкамера вызывается «напрямую».

Делаю так:

ffmpeg -f x11grab -s 955x538 -framerate 15 -i :0.0+60,124+nomouse -f v4l2 -framerate 15 -s 160x120 -i /dev/video0 -f alsa -i hw:Loopback,1,0 -f alsa -i hw:0,0 -filter_complex amix,aresample=48000 -ar 44100 -filter_complex 'overlay=main_w-overlay_w-2:main_h-overlay_h-2' -qscale 0 -f flv test.flv

Вот вывод:

 ffmpeg version 1.2.4 Copyright (c) 2000-2013 the FFmpeg developers
  built on Oct 18 2013 10:44:35 with gcc 4.5.4 (Gentoo 4.5.4 p1.0, pie-0.4.7)
  configuration: --prefix=/usr --libdir=/usr/lib64 --shlibdir=/usr/lib64 --mandir=/usr/share/man --enable-shared --cc=x86_64-pc-linux-gnu-gcc --cxx=x86_64-pc-linux-gnu-g++ --ar=x86_64-pc-linux-gnu-ar --optflags='-march=native -O2 -pipe' --extra-cflags='-march=native -O2 -pipe' --extra-cxxflags='-march=native -O2 -pipe' --disable-static --enable-gpl --enable-postproc --enable-avfilter --enable-avresample --disable-stripping --enable-version3 --disable-indev=oss --disable-indev=jack --disable-outdev=oss --disable-outdev=sdl --enable-bzlib --disable-runtime-cpudetect --disable-debug --disable-doc --disable-gnutls --enable-hardcoded-tables --enable-iconv --enable-network --disable-openssl --disable-ffplay --enable-vaapi --disable-vdpau --enable-zlib --enable-libvo-aacenc --disable-libvo-amrwbenc --enable-libmp3lame --disable-libfdk-aac --disable-libaacplus --disable-libfaac --enable-libtheora --disable-libtwolame --enable-libx264 --disable-libxvid --disable-libcdio --disable-libiec61883 --disable-libdc1394 --dis  libavutil      52. 18.100 / 52. 18.100
  libavcodec     54. 92.100 / 54. 92.100
  libavformat    54. 63.104 / 54. 63.104
  libavdevice    54.  3.103 / 54.  3.103
  libavfilter     3. 42.103 /  3. 42.103
  libswscale      2.  2.100 /  2.  2.100
  libswresample   0. 17.102 /  0. 17.102
  libpostproc    52.  2.100 / 52.  2.100
[x11grab @ 0x70feb0] 'nomouse' specification in argument is deprecated: use 'draw_mouse' option with value 0 instead
[x11grab @ 0x70feb0] device: :0.0+60,124+nomouse -> display: :0.0 x: 60 y: 124 width: 955 height: 538
[x11grab @ 0x70feb0] shared memory extension found
[x11grab @ 0x70feb0] Estimating duration from bitrate, this may be inaccurate
Input #0, x11grab, from ':0.0+60,124+nomouse':
  Duration: N/A, start: 1382594781.970223, bitrate: 246619 kb/s
    Stream #0:0: Video: rawvideo (BGR[0] / 0x524742), bgr0, 955x538, 246619 kb/s, 15 tbr, 1000k tbn, 15 tbc
[video4linux2,v4l2 @ 0x71cae0] Estimating duration from bitrate, this may be inaccurate
Input #1, video4linux2,v4l2, from '/dev/video0':
  Duration: N/A, start: 7214.102731, bitrate: 4608 kb/s
    Stream #1:0: Video: rawvideo (YUY2 / 0x32595559), yuyv422, 160x120, 4608 kb/s, 15 fps, 15 tbr, 1000k tbn, 1000k tbc
[alsa @ 0x71dc90] Estimating duration from bitrate, this may be inaccurate
Guessed Channel Layout for  Input Stream #2.0 : stereo
Input #2, alsa, from 'hw:Loopback,1,0':
  Duration: N/A, start: 1382594783.336237, bitrate: 1536 kb/s
    Stream #2:0: Audio: pcm_s16le, 48000 Hz, stereo, s16, 1536 kb/s
[alsa @ 0x71eb50] Estimating duration from bitrate, this may be inaccurate
Guessed Channel Layout for  Input Stream #3.0 : stereo
Input #3, alsa, from 'hw:0,0':
  Duration: N/A, start: 1382594783.338342, bitrate: 1536 kb/s
    Stream #3:0: Audio: pcm_s16le, 48000 Hz, stereo, s16, 1536 kb/s
Please use -q:a or -q:v, -qscale is ambiguous
File 'test.flv' already exists. Overwrite ? [y/N] y
Output #0, flv, to 'test.flv':
  Metadata:
    encoder         : Lavf54.63.104
    Stream #0:0: Audio: mp3 ([2][0][0][0] / 0x0002), 44100 Hz, stereo, s16p
    Stream #0:1: Video: flv1 ([2][0][0][0] / 0x0002), yuv420p, 955x538, q=2-31, 200 kb/s, 1k tbn, 15 tbc
Stream mapping:
  Stream #0:0 (rawvideo) -> overlay:main (graph 1)
  Stream #1:0 (rawvideo) -> overlay:overlay (graph 1)
  Stream #2:0 (pcm_s16le) -> amix:input0 (graph 0)
  Stream #3:0 (pcm_s16le) -> amix:input1 (graph 0)
  aresample (graph 0) -> Stream #0:0 (libmp3lame)
  overlay (graph 1) -> Stream #0:1 (flv)
Press [q] to stop, [?] for help
[alsa @ 0x71eb50] ALSA buffer xrun.
frame=    3 fps=0.9 q=0.0 Lsize=     821kB time=00:00:03.73 bitrate=1802.2kbits/s dup=0 drop=18

P.S: С -af, -vf у меня, почему-то, не работает, ну и фиг с ними.

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

При использовании оверлея надо позаботиться о pts, т.к. он объединяет только кадры с одинаковым pts, а остальное выкидывает (см. «drop=...» в логе). Например, начать оба потока с нулевого pts:

ffmpeg ... -filter_complex "
    [0:v] setpts=PTS-STARTPTS [screen];
    [1:v] setpts=PTS-STARTPTS [cam];
    [screen][cam] overlay=main_w-overlay_w-2:main_h-overlay_h-2
" ...

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

Без изменений, 1 fps и куча дропов. Ладно, это не критично.

Последний вопрос: Никак не удается «скормить» поток ffserver'у, если присутствуют фильтры, без них, все ок. Есть ли смысл копаться и пытаться дальше?

Гугл как-то двусмысленно говорит о том, что ffserver не умеет работать с фильтрами.

Еще раз, спасибо, что помог.

acroobat
() автор топика
Ответ на: комментарий от fopen

Вот он:

ffmpeg -f x11grab -s 955x538 -framerate 15 -i :0.0+60,124+nomouse -f v4l2 -framerate 15 -s 160x120 -i /dev/video0 -f alsa -i hw:Loopback,1,0 -f alsa -i hw:0,0 -filter_complex amix,aresample=48000 -filter_complex "[0:v] setpts=PTS-STARTPTS [screen];[1:v] setpts=PTS-STARTPTS [cam];[screen][cam] overlay=main_w-overlay_w-2:main_h-overlay_h-2" -ar 44100 -qscale 0 -f flv test.flv


ffmpeg version 1.2.4 Copyright (c) 2000-2013 the FFmpeg developers
  built on Oct 18 2013 10:44:35 with gcc 4.5.4 (Gentoo 4.5.4 p1.0, pie-0.4.7)
  configuration: --prefix=/usr --libdir=/usr/lib64 --shlibdir=/usr/lib64 --mandir=/usr/share/man --enable-shared --cc=x86_64-pc-linux-gnu-gcc --cxx=x86_64-pc-linux-gnu-g++ --ar=x86_64-pc-linux-gnu-ar --optflags='-march=native -O2 -pipe' --extra-cflags='-march=native -O2 -pipe' --extra-cxxflags='-march=native -O2 -pipe' --disable-static --enable-gpl --enable-postproc --enable-avfilter --enable-avresample --disable-stripping --enable-version3 --disable-indev=oss --disable-indev=jack --disable-outdev=oss --disable-outdev=sdl --enable-bzlib --disable-runtime-cpudetect --disable-debug --disable-doc --disable-gnutls --enable-hardcoded-tables --enable-iconv --enable-network --disable-openssl --disable-ffplay --enable-vaapi --disable-vdpau --enable-zlib --enable-libvo-aacenc --disable-libvo-amrwbenc --enable-libmp3lame --disable-libfdk-aac --disable-libaacplus --disable-libfaac --enable-libtheora --disable-libtwolame --enable-libx264 --disable-libxvid --disable-libcdio --disable-libiec61883 --disable-libdc1394 --dis  libavutil      52. 18.100 / 52. 18.100
  libavcodec     54. 92.100 / 54. 92.100
  libavformat    54. 63.104 / 54. 63.104
  libavdevice    54.  3.103 / 54.  3.103
  libavfilter     3. 42.103 /  3. 42.103
  libswscale      2.  2.100 /  2.  2.100
  libswresample   0. 17.102 /  0. 17.102
  libpostproc    52.  2.100 / 52.  2.100
[x11grab @ 0x1dbbea0] 'nomouse' specification in argument is deprecated: use 'draw_mouse' option with value 0 instead
[x11grab @ 0x1dbbea0] device: :0.0+60,124+nomouse -> display: :0.0 x: 60 y: 124 width: 955 height: 538
[x11grab @ 0x1dbbea0] shared memory extension found
[x11grab @ 0x1dbbea0] Estimating duration from bitrate, this may be inaccurate
Input #0, x11grab, from ':0.0+60,124+nomouse':
  Duration: N/A, start: 1382685376.704931, bitrate: 246619 kb/s
    Stream #0:0: Video: rawvideo (BGR[0] / 0x524742), bgr0, 955x538, 246619 kb/s, 15 tbr, 1000k tbn, 15 tbc
[video4linux2,v4l2 @ 0x1dc8af0] Estimating duration from bitrate, this may be inaccurate
Input #1, video4linux2,v4l2, from '/dev/video0':
  Duration: N/A, start: 9464.583408, bitrate: 4608 kb/s
    Stream #1:0: Video: rawvideo (YUY2 / 0x32595559), yuyv422, 160x120, 4608 kb/s, 15 fps, 15 tbr, 1000k tbn, 1000k tbc
[alsa @ 0x1dc9ca0] Estimating duration from bitrate, this may be inaccurate
Guessed Channel Layout for  Input Stream #2.0 : stereo
Input #2, alsa, from 'hw:Loopback,1,0':
  Duration: N/A, start: 1382685378.071073, bitrate: 1536 kb/s
    Stream #2:0: Audio: pcm_s16le, 48000 Hz, stereo, s16, 1536 kb/s
[alsa @ 0x1dcab60] Estimating duration from bitrate, this may be inaccurate
Guessed Channel Layout for  Input Stream #3.0 : stereo
Input #3, alsa, from 'hw:0,0':
  Duration: N/A, start: 1382685378.073175, bitrate: 1536 kb/s
    Stream #3:0: Audio: pcm_s16le, 48000 Hz, stereo, s16, 1536 kb/s
Please use -q:a or -q:v, -qscale is ambiguous
File 'test.flv' already exists. Overwrite ? [y/N] y
Output #0, flv, to 'test.flv':
  Metadata:
    encoder         : Lavf54.63.104
    Stream #0:0: Audio: mp3 ([2][0][0][0] / 0x0002), 44100 Hz, stereo, s16p
    Stream #0:1: Video: flv1 ([2][0][0][0] / 0x0002), yuv420p, 955x538, q=2-31, 200 kb/s, 1k tbn, 15 tbc
Stream mapping:
  Stream #0:0 (rawvideo) -> setpts (graph 1)
  Stream #1:0 (rawvideo) -> setpts (graph 1)
  Stream #2:0 (pcm_s16le) -> amix:input0 (graph 0)
  Stream #3:0 (pcm_s16le) -> amix:input1 (graph 0)
  aresample (graph 0) -> Stream #0:0 (libmp3lame)
  overlay (graph 1) -> Stream #0:1 (flv)
Press [q] to stop, [?] for help
[alsa @ 0x1dcab60] ALSA buffer xrun.
frame=   10 fps=1.2 q=0.0 Lsize=     948kB time=00:00:08.20 bitrate= 946.3kbits/s dup=0 drop=41 

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

Добавить фильтр fps для вебкамеры:

ffmpeg ... -filter_complex "
    [0:v] setpts=PTS-STARTPTS [screen];
    [1:v] setpts=PTS-STARTPTS,fps [cam];
    [screen][cam] overlay=main_w-overlay_w-2:main_h-overlay_h-2
" ...

Вещать в сеть можно сразу с ffmpeg без ffserver, использовав вместо выходного файла сетевые протоколы и адреса. Это если не надо VOD.

Если нужен VOD и ffserver, то можно попробовать выкрутиться, использовав цепочку ffmpeg.

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

Добавил фильтр, без изменений (1fps и дропы), к выводу добавилась строчка:

[Parsed_overlay_3 @ 0x2576570] Buffer queue overflow, dropping.

Вещать в сеть можно сразу с ffmpeg

Нет, мне нужен был, именно, собственный сервер, а с rtmp-сервером разбираться было лень :)

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

Забыл параметр для fps:

ffmpeg ... -filter_complex "
    [0:v] setpts=PTS-STARTPTS [screen];
    [1:v] setpts=PTS-STARTPTS,fps=15 [cam];
    [screen][cam] overlay=main_w-overlay_w-2:main_h-overlay_h-2
" ...

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

Без изменений :(

Поменял -framerate на -r, тоесть команда теперь выглядит так:

ffmpeg -f x11grab -s 955x538 -r 15 -i :0.0+60,124+nomouse -f v4l2 -r 15 -s 160x120 -i /dev/video0 -f alsa -i hw:Loopback,1,0 -f alsa -i hw:0,0 -filter_complex amix,aresample=48000 -ar 44100 -filter_complex -filter_complex "[0:v] setpts=PTS-STARTPTS [screen];[1:v] setpts=PTS-STARTPTS [cam];[screen][cam] overlay=main_w-overlay_w-2:main_h-overlay_h-2" -qscale 0 -f flv test.flv

fps начинается с 30, потом постепенно падает до 10, ну и звук сильно опережает картинку конечно же.

Дальше захватываю просто камеру, делаю так:

ffmpeg -f v4l2 -s 640x480 -framerate 15 -i /dev/video0 -f alsa -i hw:Loopback,1,0 -f alsa -i hw:0,0 -filter_complex amix,aresample=48000 -ar 44100 -qscale 0 -f flv test.flv

fps начинается то с 8, то 30, рандомно как-то и тоже звук опережает картинку. Ставил, убирал фильтры, fps скачет, как хочет.

то ли ffmpeg умеет не c камерой работать нормально, то ли в драйверах дело, склоняюсь больше ко второму.

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

Странно, как-то. А производительности ЦПУ хватает?

А если их просто по номеру кадра отмаркировать:

ffmpeg ... -filter_complex "
    [0:v] setpts=N/(15*TB) [screen];
    [1:v] setpts=N/(15*TB) [cam];
    [screen][cam] overlay=main_w-overlay_w-2:main_h-overlay_h-2
" ...

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

А производительности ЦПУ хватает?

Core i5, общая нагрузка около 8%.

После маркировки, в логах fps падает до 8, но на ролике скорость камеры на ролике ускорена, где-то 2x, то есть как будто с эффектом перемотки, со звуком та же беда.

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

Вот же:

Поменял -framerate на -r, fps начинается с 30, потом постепенно падает до 10

Не менять надо, а добавить на выходе! И aresample=44100. И -ar в конце.

ffmpeg -f x11grab -s 955x538 -framerate 15 -i :0.0+60,124+nomouse \
    -f v4l2 -framerate 15 -s 160x120 -i /dev/video0 \
    -f alsa -i hw:Loopback,1,0 \
    -f alsa -i hw:0,0 \
    -filter_complex amix,aresample=44100 \
    -filter_complex " \
        [0:v] setpts=PTS-STARTPTS [screen];\
        [1:v] setpts=PTS-STARTPTS,fps=15 [cam];\
        [screen][cam] overlay=main_w-overlay_w-2:main_h-overlay_h-2"\
    -f flv -ar 44100 -r 15 -qscale 0 test.flv

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

С aresample=????? я что-то запутался, но, думаю, правильно aresample=44100, как в предыдущем посте.

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

Скопипастил комманду, 1 fps и дропы

В логах та же:

[Parsed_overlay_3 @ 0x1a69000] Buffer queue overflow, dropping.

Тут у камеры постонянно fps падает, может в этом проблема, захватываю так:

ffmpeg -f v4l2 -framerate 15 -s 640x480 -i /dev/video0 -f alsa -i hw:Loopback,1,0 -f alsa -i hw:0,0 -filter_complex amix,aresample=44100  -f flv -ar 44100 -r 15 -qscale 0 test.flv

[video4linux2,v4l2 @ 0x10ee910] Estimating duration from bitrate, this may be inaccurate
Input #0, video4linux2,v4l2, from '/dev/video0':
  Duration: N/A, start: 2017.035156, bitrate: 4608 kb/s
    Stream #0:0: Video: rawvideo (YUY2 / 0x32595559), yuyv422, 160x120, 4608 kb/s, 15 fps, 15 tbr, 1000k tbn, 1000k tbc
[alsa @ 0x10efc20] Estimating duration from bitrate, this may be inaccurate
Guessed Channel Layout for  Input Stream #1.0 : stereo
Input #1, alsa, from 'hw:Loopback,1,0':
  Duration: N/A, start: 1382847284.362581, bitrate: 1536 kb/s
    Stream #1:0: Audio: pcm_s16le, 48000 Hz, stereo, s16, 1536 kb/s
[alsa @ 0x10f0b20] Estimating duration from bitrate, this may be inaccurate
Guessed Channel Layout for  Input Stream #2.0 : stereo
Input #2, alsa, from 'hw:0,0':
  Duration: N/A, start: 1382847284.364574, bitrate: 1536 kb/s
    Stream #2:0: Audio: pcm_s16le, 48000 Hz, stereo, s16, 1536 kb/s
Please use -q:a or -q:v, -qscale is ambiguous
File 'test.flv' already exists. Overwrite ? [y/N] y
Output #0, flv, to 'test.flv':
  Metadata:
    encoder         : Lavf54.63.104
    Stream #0:0: Audio: mp3 ([2][0][0][0] / 0x0002), 44100 Hz, stereo, s16p
    Stream #0:1: Video: flv1 ([2][0][0][0] / 0x0002), yuv420p, 160x120, q=2-31, 200 kb/s, 1k tbn, 15 tbc
Stream mapping:
  Stream #1:0 (pcm_s16le) -> amix:input0 (graph 0)
  Stream #2:0 (pcm_s16le) -> amix:input1 (graph 0)
  aresample (graph 0) -> Stream #0:0 (libmp3lame)
  Stream #0:0 -> #0:1 (rawvideo -> flv)
Press [q] to stop, [?] for help
[alsa @ 0x10f0b20] ALSA buffer xrun.
frame=   10 fps=0.0 q=0.0 size=      11kB time=00:00:01.20 bitrate=frame=   14 fps= 14 q=0.0 size=      21kB time=00:00:01.66 bitrate=frame=   18 fps= 12 q=0.0 size=      32kB time=00:00:02.20 bitrate=frame=   22 fps= 11 q=0.0 size=      44kB time=00:00:02.73 bitrate=frame=   26 fps= 10 q=0.0 size=      55kB time=00:00:03.19 bitrate=frame=   30 fps=9.9 q=0.0 size=      65kB time=00:00:03.73 bitrate=frame=   34 fps=9.7 q=0.0 size=      78kB time=00:00:04.20 bitrate=frame=   38 fps=9.4 q=0.0 size=      89kB time=00:00:04.73 bitrate=frame=   42 fps=9.3 q=0.0 size=     100kB time=00:00:05.20 bitrate=frame=   46 fps=9.1 q=0.0 size=     115kB time=00:00:05.73 bitrate=frame=   50 fps=9.0 q=0.0 size=     126kB time=00:00:06.19 bitrate=frame=   54 fps=8.9 q=0.0 size=     138kB time=00:00:06.73 bitrate=frame=   58 fps=8.8 q=0.0 size=     152kB time=00:00:07.20 bitrate=frame=   62 fps=8.8 q=0.0 size=     163kB time=00:00:07.73 bitrate=frame=   66 fps=8.7 q=0.0 size=     175kB time=00:00:08.20 bitrate=frame=   70 fps=8.7 q=0.0 size=     189kB time=00:00:08.73 bitrate=frame=   70 fps=8.6 q=0.0 Lsize=     196kB time=00:00:08.73 bitrate= 183.7kbits/s    

я что-то запутался

ох как я тебя понмаю :)

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

А если просто вебкамеру посмотреть:

ffplay -f video4linux2 /dev/video0

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

Похоже на автоэкспозицию у камеры.

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

Отключить автоэкспозицию. Ищем регулятор Exposure:

v4l2-ctl --list-ctrls-menus
и меняем его с авто на абсолютное значение
v4l2-ctl --set-ctrl=<ctrl>=<val>
Теперь камера должа выдавать кадры с постоянной частотой.

Если надо второй путь, скажи, подумаю, ... там надо буфер для потока x11grab добавить.

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

И второй вариант, для переменной частоты кадров вебкамеры, надо добавить буфер fifo для потока с экрана:

ffmpeg -f x11grab -s 955x538 -framerate 15 -i :0.0+60,124+nomouse \
    -f v4l2 -framerate 15 -s 160x120 -i /dev/video0 \
    -f alsa -i hw:Loopback,1,0 \
    -f alsa -i hw:0,0 \
    -filter_complex amix,aresample=44100 \
    -filter_complex " \
        [0:v] setpts=PTS-STARTPTS,fifo [screen];\
        [1:v] setpts=PTS-STARTPTS,fps=15 [cam];\
        [screen][cam] overlay=main_w-overlay_w-2:main_h-overlay_h-2"\
    -f flv -ar 44100 -r 15 -qscale 0 test.flv

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

Нету регулятора автоэкспозиции, скажи, пожалуйста, второй путь.

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

Для версии 1.2.4, ля минор:

ffmpeg -f x11grab -s 955x538 -framerate 15 -i :0.0+60,124+nomouse \
    -f v4l2 -framerate 15 -s 160x120 -i /dev/video0 \
    -f alsa -i hw:Loopback,1,0 \
    -f alsa -i hw:0,0 \
    -filter_complex amix,aresample=44100 \
    -filter_complex " \
        [0:v] setpts=PTS-STARTPTS,fifo [screen];\
        [1:v] setpts='(RTCTIME - RTCSTART) / (TB * 1000000)',fps=15 [cam];\
        [screen][cam] overlay=main_w-overlay_w-2:main_h-overlay_h-2"\
    -f flv -ar 44100 -r 15 -qscale 0 test.flv

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

Исключим пока звук. Если это

ffmpeg -f x11grab -s 955x538 -framerate 15 -i :0.0+60,124+nomouse \
    -f v4l2 -framerate 15 -s 160x120 -i /dev/video0 \
    -filter_complex " \
        [0:v] setpts=PTS-STARTPTS [screen];\
        [1:v] setpts='(RTCTIME - RTCSTART) / (TB * 1000000)' [cam];\
        [screen][cam] overlay=main_w-overlay_w-2:main_h-overlay_h-2"\
    -f flv -an test.flv
не даст ожидаемого результата, то покажи, что выдает это:
ffmpeg -f x11grab -s 955x538 -framerate 15 -i :0.0+60,124+nomouse \
    -f v4l2 -framerate 15 -s 160x120 -i /dev/video0 \
    -filter_complex " \
        [0:v] setpts=PTS-STARTPTS [screen];\
        [1:v] setpts='(RTCTIME - RTCSTART) / (TB * 1000000)' [cam];\
        [screen][cam] overlay=main_w-overlay_w-2:main_h-overlay_h-2, showinfo"\
    -f flv -vframes 30 -an test.flv

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

Похоже первый советчик в чем-то прав, x11grab не правильно временные метки ставит. Тогда так:

ffmpeg -f x11grab -s 955x538 -framerate 15 -i :0.0+60,124+nomouse \
    -f v4l2 -framerate 15 -s 160x120 -i /dev/video0 \
    -filter_complex " \
        [0:v] setpts='RTCTIME / (TB * 1000000)' [screen];\
        [1:v] setpts='RTCTIME / (TB * 1000000)' [cam];\
        [screen][cam] overlay=main_w-overlay_w-2:main_h-overlay_h-2, fps=15"\
    -f flv -an test.flv

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

Все в сборе

ffmpeg -f x11grab -s 955x538 -framerate 15 -i :0.0+60,124+nomouse \
    -f v4l2 -framerate 15 -s 160x120 -i /dev/video0 \
    -f alsa -i hw:Loopback,1,0 \
    -f alsa -i hw:0,0 \
    -filter_complex " \
        [0:v] setpts='RTCTIME / (TB * 1000000)' [screen];\
        [1:v] setpts='RTCTIME / (TB * 1000000)' [cam];\
        [screen][cam] overlay=main_w-overlay_w-2:main_h-overlay_h-2, fps=15"\
    -filter_complex amix,aresample=44100 \
    -f flv -qscale 2 test.flv
Для qscale в данном случае минимум = 2. Наилучшее качество. Вроде бы. Там же mpeg.

В данном случае setpts с RTCTIME использован из-за ошибок в ffmpeg. После перехода на версию 2.0 и выше можно будет выкинуть setpts для видеокамеры, и возможно для x11grab. Воспроизводить мне лень, но судя по коду, последняя версия ffmpeg должна работать без использования setpts.

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

Все в сборе

Так на выходе получается mp3 формат без видео

Stream mapping:
  Stream #0:0 (rawvideo) -> setpts (graph 0)
  Stream #1:0 (rawvideo) -> setpts (graph 0)
  Stream #2:0 (pcm_s16le) -> amix:input0 (graph 1)
  Stream #3:0 (pcm_s16le) -> amix:input1 (graph 1)
  fps (graph 0) -> Stream #0:0 (flv)
  aresample (graph 1) -> Stream #0:1 (libmp3lame)

acroobat
() автор топика
Ответ на: комментарий от fopen

mpv выдает это

[[ffmpeg/flv]] max_analyze_duration 5000000 reached at 5018000 microseconds
[ffmpeg/flv] Could not find codec parameters for stream 0 (Video: none, 200 kb/s): unspecified size
Consider increasing the value for the 'analyzeduration' and 'probesize' options

acroobat
() автор топика
Ответ на: комментарий от acroobat
ffmpeg -f x11grab -s 955x538 -framerate 15 -i :0.0+60,124+nomouse \
    -f v4l2 -framerate 15 -s 160x120 -i /dev/video0 \
    -f alsa -i hw:Loopback,1,0 \
    -f alsa -i hw:0,0 \
    -filter_complex " \
        [0:v] setpts='(RTCTIME - RTCSTART) / (TB * 1000000)' [screen];\
        [1:v] setpts='(RTCTIME - RTCSTART) / (TB * 1000000)' [cam];\
        [screen][cam] overlay=main_w-overlay_w-2:main_h-overlay_h-2, fps=15"\
    -filter_complex amix,aresample=44100 \
    -f flv -qscale 2 test.flv
fopen ★★
()
Ответ на: комментарий от fopen

Все работает, синхронизация отличная, качество тоже. Благодарю тебя за нескончаемое терпение и за помощь.

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