Nieuws:

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: Opnemen van v4l2-input (camera, EasyCap...) naar bestand met FFmpeg  (gelezen 145 keer)

Offline xinuzimi

  • Lid
[Vertaling van mijn Engelstalige Ubuntu forums post]

Hallo,

Ten eerste, installeer een degelijke FFmpeg versie.

Deze installatiewijze zal momenteel op de meeste systemen het best werken:

sudo add-apt-repository ppa:mc3man/trusty-media
sudo apt-get update
sudo apt-get install ffmpeg

Ik ben hier uitgegaan van de 'EasyCap'-stick die goedkoop in de handel is te verkrijgen.
Hij is handig te gebruiken met allerlei input apparatuur naar usb. Al wat scart UIT (of een gewone scart-ingang mits gebruik van een nog steeds vlot in de handel te verkrijgen scart-UIT-naar-composite-of-s-video-kabel) en of composite of s-video heeft.
De stick is altijd vergezeld van 'Windows-Only'-software, maar is ook perfect te gebruiken op Linux.
Meer (Engelstalige) uitleg over deze stick hier: Easycap stick @ linuxtv.org.

Eventueel zul je eveneens een composite- of s-video- of usbverlengkabel nodig hebben.

De capture code dan...

1) Video + audio goed gesynchroniseerd opnemen naar bestand

Ik krijg in deze context dikwijls de indruk dat opnemen naar xvid(mpeg4)/mp3/avi betere resultaten geeft dan bijv. naar h264-x264/aac/mp4.
Uittesten maar!

De code (voor het, in het gegeven geval, opnemen van een PAL tv-systeem):

ffmpeg -f v4l2 -standard PAL -i /dev/video0 -f alsa -i hw:2,0 -vcodec libxvid -b:v 2000k -s 720x576 -r 25 -aspect 16:9 -force_key_frames 00:00:00.000 -acodec mp3 -b:a 128k -channels 2 -ar 48000 output.avi
-standard = belangrijk om het exact op die plaats achter v4l2 te plaatsen i.v.m. het gebruikte tv-systeem. Video4linux heeft de neiging alles als het Amerikaanse NTSC tv-systeem te interpreteren. PAL (meestal in Europa) of SECAM (Frankrijk) moet je bijgevolg wat forceren.
-b:v = video bitrate kbps
-s = grootte widthxheight (doordat ik het over PAL heb, heb ik hier ook geëncodeerd naar de gewoonlijke PAL-grootte.)
-r = fps of frames per seconde. Gewoonlijk 25 bij PAL, eerder 30 bij NTSC.
-aspect = DAR (Display Aspect Ratio). 16:9 voor een meer modern breedbeeld HD uitzicht. Als je het weglaat zul je automatisch de dar van het input device krijgen (5:4 of 4:3 bij PAL).
-force_key_frames 00:00:00.000 = om één of andere reden zeer belangrijk om video en audio te doen gelijklopen.
-b:a = audio bitrate. Meest gebruikt: 96 of 128 kbps.
-channels 2 = stereo mode.
-ar = geluidsfrequentie (Gewoonlijk 44100 hz of 48000 hz. Meestal, in video's het laatste. Behoud bij voorkeur de hz/frequentie van de audio input. Zie verder. )

Soms werkt deze code beter:

ffmpeg -f v4l2 -standard PAL -i /dev/video0 -f alsa -i hw:2,0 -vcodec mpeg4 -vtag xvid -qscale:v 12 -s 720x576 -r 25 -aspect 16:9 -force_key_frames 00:00:00.000 -acodec mp3 -b:a 128k -channels 2 -ar 48000 output_0001.avi

'-vcodec mpeg4 -vtag xvid -qscale:v 12' captiveert in variabele bitratemodus.

'-qscale'-waarden: 1 tm 31, waarbij 1 hoogste kwaliteit/grootste bestand betekent. Waarde 12 is een aanneembaar gemiddelde.

(Lees eveneens mijn 'Tips voor beter opnemen' aan het eind van deze post)

Het meest logische voor mij is om de input video- en audiostromen (zoals-ze-zijn - zonder teveel extra codering) te groeperen om daarna de bestandsdetails van video en audio te schrijven (-vcodec en -acodec).

'/dev/video0' and 'hw:2,0' zijn systeem afhankelijk.
Je zou i.v.m. het opnemen van de correcte audio-input (alsa hw:0,0 ; hw:1,0 ; hw:1,2 ; hw:2,0 enz.) de VLC-speler kunnen openen en naar Media -> Opname apparaat openen -> Opnamemodus (Video Camera bijv.) -> Video-apparaatnaam: meestal /dev/video0 | Audio-apparaatnaam: een hw selecteren die geluid weergeeft bij afspelen -> Videostandaard: bijv. PAL gaan. Dit kan ietwat verschillen volgens VLC-versie.
Opnemen met VLC gaat ook, maar FFmpeg geeft volgens mij beter resultaat.

Je plakt de hoger vermelde codelijn (waarschijnlijk van een tekstbestand) in je terminal (die je het best opent vanuit de dir waar je het videobestand wilt bewaren).
De opname kan worden onderbroken/bewaard door 'q' aan te drukken.
Heringevoerd door de pijltjestoets 'Opwaarts' te drukken. Verander eventueel de output bestandsnaam of zijn bestandsnummer i.v.m. nieuw bestand.

Indien je nog steeds video-audiosync problemen zou ondervinden, pas deze toe:

2) Achteraf video en audio synchroniseren in stream copy modus (zonder de video te hercompileren)

ffmpeg -i input.avi -itsoffset 0.2 -i input.avi -map 0:0 -map 1:1  -acodec copy -vcodec copy synced.avi

'0.2' is de vertraging in seconden. Meestal 0.2, soms '1.0' bij zeer slecht gesynchroniseerde video's.

Bij sommige video's is het soms nodig dit eerst te doen, ook met -itsoffset 0.0, om ze naderhand vlotter te kunnen
bewerken met bijvoorbeeld avidemux.

Als je een andere aspect ratio voor je video wilt, gebruik dit:

3) Display Aspect Ratio veranderen in stream copy modus

ffmpeg -i input.avi -vcodec copy -acodec copy -aspect 4:3 output.avi
Meestal zul je de video echter eerder van 4:3  naar 16:9 willen veranderen.
Hoogstnoodzakelijk is het niet, gezien je dit in de meeste videospelers kunt instellen.

Deze ffmpeg codes werken momenteel voor mij, maar je mag natuurlijk altijd becommentariëren als je iets verkeerd ziet.

Ook andere inputapparatuur kun je op een gelijkaardige manier captiveren.
Zie: devices @ ffmpeg.org.

===

Tips voor beter opnemen

1) Systeem swappiness

Check en pas eventueel aldus aan:

gksudo gedit /etc/sysctl.conf

Er zou een regel als deze moeten staan in sysctl.conf:

vm.swappiness=60

60 is gewoonlijk de standaard.
Ik had dat op een oudere computer (32bits, 1Gb ram) ingesteld op 5.
MAAR, herveranderd naar de waarde 30. Wat tot een veel geslaagdere video-opname leidde.

2) Geen beeld, geen geluid enz...

Om te testen, open VLC. 'Opnameapparaat openen', en nakijken welke video4linux-video (/dev/video0; /dev/video1 etc) er afspeelt en welke alsa audio input (hw:0,0; hw:1,0; hw:2,0 etc). Dit nadat je de correcte (analoge) geluidsinput van de binnenkomende geluidsgolf hebt ingesteld in je geluidsinstellingen. FFmpeg zal er je in je terminal sowieso op wijzen indien iets niet is zoals het hoort.

Deze dingen zullen verschillen tussen computers.

Wanneer FFmpeg niet onmiddellijk een videobeeld opneemt, probeer het dan een tweede keer. Doe altijd eerst enkele testopnames. Tot je een opname verkrijgt die convenabel afspeelt in de standaard Ubuntu filmspeler (en/of andere).

Als het nog steeds niet is wat je ervan verwacht, probeer dan een andere usb poort.

3) Andere geluidsproblemen

Probeer de originele audiofrequentie te behouden tijdens opname.
Als hij 48000 hz is, niet veranderen.

Of je kunt de originele geluidsgolf opnemen zoals-hij-is op deze manier:

ffmpeg -f v4l2 -standard PAL -framerate 25 -i /dev/video0 -f alsa -i hw:2,0 -vcodec libxvid -b:v 2000k -s 720x576 -r 25 -aspect 16:9 -force_key_frames 00:00:00.000 -acodec copy output_0001.avi


'-acodec copy' dus.

Raadzaam bij bibberend beeld en/of tikkend geluid.

De pure invoerstroom van een toestel zal meestal mpeg(2) of avi met pcm of ac3 of mpeg geluid zijn.
Vooral de pure video invoer kan qua grootte enorm zijn als je hem kopieert. De pure audio invoer minder enorm.
Encodeer de video (nogmaals, beste resultaten hier met xvid/avi, maar je zou x264/mkv-mp4 kunnen proberen...) en behoud de originele audio (met de originele hz frequentie) wanneer je geluidsproblemen ondervindt.

Bovendien vergt het niet teveel tijd om achteraf alleen de originele geluidsgolf naar mp3 of aac of iets anders te hercoderen. Je zou daarvoor FFmpeg of avidemux kunnen gebruiken.

4) Voorkom zwarte tussenbeelden

Opletten hiermee. Ze kunnen zich vooral bij langere opnames voordoen.

Mogelijke oplossing: 10 to 15 minuten per keer opnemen.

« Laatst bewerkt op: Vandaag om 12:27:33 door xinuzimi »

Offline xinuzimi

  • Lid
Re: Opnemen van v4l2-input (camera, EasyCap...) naar bestand met FFmpeg
« Reactie #1 Gepost op: 2017/03/13, 23:34:44 »
Mijn excuses dat ik dit onderwerp gaandeweg nogal wat geherediteerd heb.

Terwijl ik het één en ander aan het uittesten ben, dient het één en ander aangepast.
« Laatst bewerkt op: 2017/03/19, 19:16:19 door xinuzimi »