Спасайте, бьюсь третий день, ничего не могу поделать. Стоит задача: организовать потоковое вещание рабочего стола со звуком от микрофона. Причём нельзя делать так, чтобы отдельно записать видео, отдельно звук и потом всё это смешать с нужными коррекциями. Вещать надо в режиме реального времени.
Проблема: звук опережает видео. Задержка достаточно стабильная - около 3,5 секунд. Читал мануалы и Гугл, пытался поправить с помощью -itsoffset. Не работает, такое впечатление, что параметр -itsoffset игнорируется. Для экспериментов начал всё записывать в файл, а не rtmp-поток - ничего не меняется.
Делаю захват скриптом так (в оригинале, без коррекции):
#!/bin/bash
INRES="hd720"
OUTRES="wvga"
FPS="24"
QUAL="medium"
ffmpeg -f x11grab -s "$INRES" -r "$FPS" -i :0.0 -f alsa -ac 2 -i hw:0 -vol 4096 -vcodec libx264 -vpre "$QUAL" -s "$OUTRES" -acodec libmp3lame -ab 96k -ar 22050 -threads 0 -f flv mystream.flv
Пробовал по разным мануалам делать так:
ffmpeg -f x11grab -s "$INRES" -r "$FPS" -i :0.0 -f alsa -ac 2 -itsoffset 3.5 -i hw:0 -vol 4096 -vcodec libx264 -vpre "$QUAL" -s "$OUTRES" -acodec libmp3lame -ab 96k -ar 22050 -threads 0 -f flv mystream.flv
или
ffmpeg -f x11grab -s "$INRES" -r "$FPS" -i :0.0 -itsoffset 3.5 -f alsa -ac 2 -i hw:0 -vol 4096 -vcodec libx264 -vpre "$QUAL" -s "$OUTRES" -acodec libmp3lame -ab 96k -ar 22050 -threads 0 -f flv mystream.flv
Задержка сохраняется. Пробовал синтаксис 00:00:03.5 для itsoffset, пробовал делать задержку для видео (соответственно вставляя itsoffset либо перед -f x11grab, либо перед -i :0.0), пробовал ставить itsoffset и перед видео, и перед аудио с разными значениями, пробовал выставлять задержку в 20 секунд (думал, что не замечаю уже задержек в 3.5). Ничего не помогает, такое впечатление, что опция itsoffset игнорируется.
На форуме Убунту прочитал, что вроде как кто-то решил подобную проблему обновлением ffmpeg. Обновился. При обновлении ffmpeg мне написали, что THIS PROGRAM IS DEPRECATED и посоветовали использовать avconv. ffmpeg, кстати, удалился. Пробовал avconv - аналогичная ситуация. itsoffset не работает. Снова поставил ffmpeg - он поставился свежее, чем есть, но проблема не исчезла.
Строка захвата для avconv:
avconv -f x11grab -s "$INRES" -r "$FPS" -i :0.0 -f alsa -ac 2 -i hw:0 -vol 4096 -vcodec libx264 -s "$OUTRES" -acodec libmp3lame -ab 96k -ar 22050 -threads 0 -f flv mystream.flv
C itsoffset извращался аналогично.
Пробовал ещё опцию async - с ней звук вообще не захватывается. Никак и ни в каком виде. При попытке поставить isync - теряю захват чего бы то ни было - нет ни видео, ни звука.
Система - Debian 6, подключены репы backports и debian-multimedia. Обновлён из backports. ffmpeg ставил из реп, ничего самосборного нет.
$ uname -sro
Linux 3.2.0-0.bpo.2-amd64 GNU/Linux
Версии ffmpeg и avconv (меня, кстати, они смущают - такое впечатление, что вместо ffmpeg без моего ведома работает avconv):
~$ ffmpeg
ffmpeg version 0.8.3-6:0.8.3-1~bpo60+1, Copyright (c) 2000-2012 the Libav developers
built on Jun 16 2012 10:32:51 with gcc 4.4.5
$ avconv
avconv version 0.8.3-6:0.8.3-1~bpo60+1, Copyright (c) 2000-2012 the Libav developers
built on Jun 16 2012 10:32:51 with gcc 4.4.5
Проверил, вроде как ffmpeg идёт отдельной сущностью:
$ which ffmpeg
/usr/bin/ffmpeg
$ which avconv
/usr/bin/avconv
~$ ls -l /usr/bin/ff*
-rwxr-xr-x 1 root root 108112 Июн 16 18:36 /usr/bin/ffmpeg
lrwxrwxrwx 1 root root 6 Июл 22 20:33 /usr/bin/ffplay -> avplay
lrwxrwxrwx 1 root root 7 Июл 22 20:33 /usr/bin/ffprobe -> avprobe
lrwxrwxrwx 1 root root 8 Июл 22 20:33 /usr/bin/ffserver -> avserver
$ ls -l /usr/bin/av*
-rwxr-xr-x 1 root root 111344 Июн 16 18:36 /usr/bin/avconv
-rwxr-xr-x 1 root root 77904 Июн 16 18:36 /usr/bin/avplay
-rwxr-xr-x 1 root root 42096 Июн 16 18:36 /usr/bin/avprobe
-rwxr-xr-x 1 root root 99864 Июн 16 18:36 /usr/bin/avserver