доброго времени суток всем! всю неделю ломаю голову над, как казалось с начала, простой командой.
задача такова: писать видео и звук в один фаил с USB камеры
система ubuntu 12.04 server, creative VF0640 Live! Cam Socialize
вариантов миллион, объявляю короткую команду
sudo avconv -f video4linux2 -i /dev/video0 -f alsa -i plughw:0 test.mpg <--- в принципе должна работать с любой системой и любым железом;
ешё использую аргументы для видео: -s, -t,...; аудио -ar, -ab; -vcodec, -acodec разные комбинации, но как-то ничего дельного не получается
получаю на выходе:
kamera@kamerine:~$ sudo avconv -f video4linux2 -i /dev/video0 -f alsa -i plughw:0 test.mpg
[sudo] password for kamera:
avconv version 0.8.5-4:0.8.5-0ubuntu0.12.04.1, Copyright (c) 2000-2012 the Libav developers
built on Jan 24 2013 18:03:14 with gcc 4.6.3
[video4linux2 @ 0x8fa5b00] Estimating duration from bitrate, this may be inaccurate
Input #0, video4linux2, from '/dev/video0':
Duration: N/A, start: 231370.901795, bitrate: 147456 kb/s
Stream #0.0: Video: rawvideo, yuyv422, 640x480, 147456 kb/s, 30 tbr, 1000k tbn, 30 tbc
[alsa @ 0x8fa6240] capture with some ALSA plugins, especially dsnoop, may hang.
[alsa @ 0x8fa6240] Estimating duration from bitrate, this may be inaccurate
Input #1, alsa, from 'plughw:0':
Duration: N/A, start: 231372.999953, bitrate: N/A
Stream #1.0: Audio: pcm_s16le, 48000 Hz, 2 channels, s16, 1536 kb/s
Incompatible pixel format 'yuyv422' for codec 'mpeg1video', auto-selecting format 'yuv420p'
[buffer @ 0x8fb0d80] w:640 h:480 pixfmt:yuyv422
[avsink @ 0x8fb1320] auto-inserting filter 'auto-inserted scaler 0' between the filter 'src' and the filter 'out'
[scale @ 0x8fa8c60] w:640 h:480 fmt:yuyv422 -> w:640 h:480 fmt:yuv420p flags:0x4
[mpeg @ 0x8fa8360] VBV buffer size not set, muxing may fail
Output #0, mpeg, to 'test.mpg':
Metadata:
encoder : Lavf53.21.1
Stream #0.0: Video: mpeg1video, yuv420p, 640x480, q=2-31, 200 kb/s, 90k tbn, 30 tbc
Stream #0.1: Audio: mp2, 48000 Hz, 2 channels, s16, 128 kb/s
Stream mapping:
Stream #0:0 -> #0:0 (rawvideo -> mpeg1video)
Stream #1:0 -> #0:1 (pcm_s16le -> mp2)
Press ctrl-c to stop encoding
ALSA buffer xrun. 0 q=2.0 size= 0kB time=2.57 bitrate= 0.0kbits/s dup=76 drop=0 <----- тут, как я понемаю, показывает аудио input bits
^C
frame= 543 fps= 38 q=6.6 Lsize= 986kB time=13.73 bitrate= 588.4kbits/s dup=448 drop=0<----- тут, опять-же, как я понемаю, видео input bits
video:761kB audio:214kB global headers:0kB muxing overhead 1.107445% <-- здесь тоже вроде показывает, что аудио сколько-то битoв записало
Received signal 2: terminating.
так вот проблема: видео биты меняются, прыгают, и видео пишет без проблем, всё понятно, но аудио биты на нуле, и проигрывая фаил звук страшно отстаёт. секунды на 4-5. помогите разобраться, бо в интернете у многих такая проблема. так может раз и навсегда разберёмся коллективно
p.s. с микрофоном всё в порядке, и система его может использовать, бо
sudo arecord -f S16_LE -D
plughw:0 test.wav команда пишет звук идеально, но в отдельный фаил
p.p.s
plughw: работает с
0 и
1, но
2 и выше выкидывает эрор:
ALSA lib pcm_hw.c:1401:(_snd_pcm_hw_open) Invalid value for card
arecord: main:682: audio open error: No such file or directory
я представляю, что если микрофон один, то он и должен работать с одним значением, а тут работает с двумя, как буд-то микрофонов 2
ешё было-бы неплохо приписать аргумент, чтобы стримило видео в веб, чтобы в real-time можно было посмотреть что происходит или в браузере, или vlc, не важно, и звук в стриме не важен