ffmpeg converteren naar H264

Pagina: 1
Acties:

Onderwerpen

Vraag


Acties:
  • 0 Henk 'm!

  • NathanVerkerk
  • Registratie: Juli 2018
  • Laatst online: 09-07 20:57
Hallo allemaal,

Ik ben een IT student aan het Grafisch Lyceum Rotterdam, en ik heb een opdracht voor school
Ik ben al een tijdje bezig met een script in powershell waarin ik ffmpeg gebruik.
Ik wil graag een ffmpeg commando in een powershell function gebruiken, maar het ffmpeg commando is waarschijnlijk verkeerd.

Het doel is om een videobestand om te zetten naar het H264 codec.
Het volgende commando gebruik ik momenteel hiervoor:
code:
1
ffmpeg -i $input -c:v libx264 -preset slow -crf 10 -c:a copy $output

Ik krijg de volgende foutmelding als ik dit uitvoer:
-c:v: Protocol not found
Did you mean file:-c:v?


Ik heb al even gezocht op het internet, en ik vond eigenlijk maar 1 mogelijke oplossing. Die oplossing is om
code:
1
-c:v libx264
te vervangen door
code:
1
-vcodec libx264
.
Ik heb dit uitgeprobeerd, maar helaas werkt dit niet.
Dit bovenstaande is van deze link:
https://stackoverflow.com...ideo-to-h264-codec-format.

Ik ben ten einde raad, zou iemand mij hiermee kunnen helpen?
Dank!

Beste antwoord (via NathanVerkerk op 12-04-2021 22:47)


  • Hero of Time
  • Registratie: Oktober 2004
  • Laatst online: 16-09 21:43

Hero of Time

Moderator LNX

There is only one Legend

Als je het ffmpeg commando met de hand uitvoert en alle opties/argumenten uit typt ipv met variabelen opgeven, werkt het dan wel?

Wat wordt bedoelt met 'filename escapen' is dat je zorgt dat het je bestandsnaam als een enkel argument accepteert. Argumenten en opties worden met spaties gescheiden, dus als je een bestandsnaam opgeeft met een spatie er in en dit niet goed doet, lijkt het net alsof je twee argumenten of opties bedoelt en dan kan je onverwachte resultaten krijgen.
Zonder escapen zou dit niet werken:
ffmpeg -i een video.avi -c:v libx264 -c:a copy resultaat.mkv

Je zal dan meldingen krijgen dat het het opgegeven bestand niet kan vinden, of een optie niet kent, etc. In plaats daarvan zou een van de opties hieronder wel werken:
ffmpeg -i "een video.avi" -c:v libx264 -c:a copy resultaat.mkv
ffmpeg -i 'een video.avi' -c:v libx264 -c:a copy resultaat.mkv
ffmpeg -i een\ video.avi -c:v libx264 -c:a copy resultaat.mkv

Die laatste is iets wat bij Linux shells veel gebruikt wordt, maar Powershell kan een ander escape teken gebruiken om speciale tekens apart te behandelen.

Commandline FTW | Tweakt met mate

Alle reacties


Acties:
  • 0 Henk 'm!

  • g0tanks
  • Registratie: Oktober 2008
  • Laatst online: 08:53

g0tanks

Moderator CSA
Krijg je ook een foutmelding als je $input vervangt door de echte waarde? En zitten er nog gekke tekens in de bestandsnaam?

Ultrawide gaming setup: AMD Ryzen 7 2700X | NVIDIA GeForce RTX 2080 | Dell Alienware AW3418DW


Acties:
  • 0 Henk 'm!

  • NathanVerkerk
  • Registratie: Juli 2018
  • Laatst online: 09-07 20:57
Om deze vraag te kunnen beantwoorden moet ik eerst mijn script een klein beetje uitleggen denk ik....
Ik had namelijk $input en $output even snel als placeholders gebruikt.

De gebruiker kan in mijn script kiezen om een bestand te uploaden, de gebruiker klikt in een powershell gui op een knop die met een onclick event de volgende regels code triggert:
code:
1
2
3
4
5
6
7
8
#Filebrowser aanmaken
$browsevid = New-Object -TypeName System.Windows.Forms.OpenFileDialog
#Standaard directory waar de filebrowser in start
$browsevid.InitialDirectory = $StandaardDirectory
#Filter voor de geaccepteerde bestanden
$browsevid.Filter = "mp4 files (*.mp4)|*.mp4"
#Destination aangeven waar het bestand heen gaat
$destinationvid = 'C:\ffmpeg files\upload'


Met een andere knop wordt vervolgens het gekozen bestand in de filebrowser geupload naar een map met de volgende code:
code:
1
Copy-Item -Path $browsevid.FileName -Destination $destinationvid


code:
1
ffmpeg.exe -i $destinationvid.FileName -c:v libx264 -preset medium -crf 10 -c:a aac $output + $naam + $Date.mp4


Mijn variable met het pad van het bestand heet dus
code:
1
$destinationvid
, ik weet niet zeker of ik
code:
1
$destinationvid.filename
of
code:
1
$destinationvid
moet typen. Dat ga ik uittesten.

De bestandsnaam is vrij normaal, het is een .mp4 bestand en het raarste wat erin zit is een spatie.

Hopelijk heb ik het duidelijk uitgelegd ;).

Edit: na een kleine test ziet het ernaar uit dat het wel degelijk nodig is om
code:
1
$destinationvid.Filename
te gebruiken. Als ik alleen maar
code:
1
$destinationvid
gebruik pakt het script echt alleen maar het pad.
Al kan ik volgens mij natuurlijk wel de volgende code toevoegen om het om te zetten naar een normaal variable zonder de .Filename:
code:
1
$destination = $destinationvid.Filename

[ Voor 13% gewijzigd door NathanVerkerk op 09-04-2021 20:12 . Reden: Toevoegen van informatie na de test ]


Acties:
  • 0 Henk 'm!

  • Danielson
  • Registratie: Januari 2003
  • Laatst online: 13:21
Probeer het eens met Start-Process i.c.m. -Arugumentlist:

Start-Process -FilePath "ffmpeg.exe" -ArgumentList "-i $input -c:v libx264 -preset slow -crf 10 -c:a copy $output"

Acties:
  • 0 Henk 'm!

  • NathanVerkerk
  • Registratie: Juli 2018
  • Laatst online: 09-07 20:57
Ik heb het geprobeerd maar helaas werkt het niet.
Ik zie wel even snel een flits van een cmd window, maar ik zie geen bestand verschijnen in de map. Ook niet als ik de naam van het eindbestand even vastzet naar bijvoorbeeld test.mp4 in de command.

Acties:
  • 0 Henk 'm!

  • DukeBox
  • Registratie: April 2000
  • Laatst online: 13:12

DukeBox

loves wheat smoothies

NathanVerkerk schreef op vrijdag 9 april 2021 @ 20:40:
Ik zie wel even snel een flits van een cmd window
Zet anders even een pause aan het einde zodat je evt. een melding kan zien.
Je gaf ook aan dat er een spatie in de naam zit, zorg dan dat je dan de filename volledig escaped.

Duct tape can't fix stupid, but it can muffle the sound.


Acties:
  • 0 Henk 'm!

  • NathanVerkerk
  • Registratie: Juli 2018
  • Laatst online: 09-07 20:57
Ik heb net inderdaad ook geprobeerd om pause aan het einde te zetten, binnen de hoge komma's en daarbuiten geprobeerd, maar dat werkt helaas ook niet.

En kan je mij misschien uitleggen wat je precies bedoelt met filename escapen?
Ik denk niet dat ik het snap.

Acties:
  • Beste antwoord
  • 0 Henk 'm!

  • Hero of Time
  • Registratie: Oktober 2004
  • Laatst online: 16-09 21:43

Hero of Time

Moderator LNX

There is only one Legend

Als je het ffmpeg commando met de hand uitvoert en alle opties/argumenten uit typt ipv met variabelen opgeven, werkt het dan wel?

Wat wordt bedoelt met 'filename escapen' is dat je zorgt dat het je bestandsnaam als een enkel argument accepteert. Argumenten en opties worden met spaties gescheiden, dus als je een bestandsnaam opgeeft met een spatie er in en dit niet goed doet, lijkt het net alsof je twee argumenten of opties bedoelt en dan kan je onverwachte resultaten krijgen.
Zonder escapen zou dit niet werken:
ffmpeg -i een video.avi -c:v libx264 -c:a copy resultaat.mkv

Je zal dan meldingen krijgen dat het het opgegeven bestand niet kan vinden, of een optie niet kent, etc. In plaats daarvan zou een van de opties hieronder wel werken:
ffmpeg -i "een video.avi" -c:v libx264 -c:a copy resultaat.mkv
ffmpeg -i 'een video.avi' -c:v libx264 -c:a copy resultaat.mkv
ffmpeg -i een\ video.avi -c:v libx264 -c:a copy resultaat.mkv

Die laatste is iets wat bij Linux shells veel gebruikt wordt, maar Powershell kan een ander escape teken gebruiken om speciale tekens apart te behandelen.

Commandline FTW | Tweakt met mate


Acties:
  • 0 Henk 'm!

  • NathanVerkerk
  • Registratie: Juli 2018
  • Laatst online: 09-07 20:57
Dankjewel voor deze uitleg! Dat helpt enorm, ik wist inderdaad wel af van die hoge komma's die je kan gebruiken, maar dat dat escapen heet niet, plus dat deze uitleg het nog meer verhelderd heeft.

Ik heb het ffmpeg commando even in een normaal powershell window uitgevoerd, alleen dan even met de bestanden manual aangeven (dus zonder de variables. Dan werkt het wel. Ik denk dat het dan zal moeten liggen aan de variables die hij niet snapt.

Ik weet nu dus dat het commando goed is, en dat ffmpeg de variables die ik gebruik niet snapt.
(als dit een verkeerde diagnose is, vertel het gerust, ik leer er alleen maar van!)

Hierna ben ik terug gegaan naar het script, en verder gaan denken hoe ik dit kan oplossen.
Eerst dacht ik dat het escapen wel alles zou oplossen, maar dit bleek niet zo te zijn. met $destinationvid.Filename tussen de " werkt het nog steeds niet.
Ik dacht toen dat .filename het probleem zou zijn, daarom heb ik deze regel code erboven gezet:
code:
1
$input1 = $destinationvid.Filename

Hierna werkte helaas alles nog steeds niet, en kreeg ik weer de foutcode die deze topic heeft laten starten.

Het probleem wat ik dus volgens mij heb is het volgende.
Mijn filebrowser geeft mij het variable $destinationvid.filename
$destinationvid geeft alleen het pad van het bestand, .filename geeft de naam van het bestand (hier hoort de extensie bij, dus .mp4 bijvoorbeeld).
ffmpeg snapt de variable van de input niet, en kan daardoor niet transcoderen.

Zeer interessant probleem dit, moet ik eerlijk zeggen.

Als ik iets verkeerd heb gezegd, of iets verkeerd heb opgevat, zeg het gerust! Zoals ik al vaker zei, ik leer er alleen maar van!

Acties:
  • 0 Henk 'm!

  • g0tanks
  • Registratie: Oktober 2008
  • Laatst online: 08:53

g0tanks

Moderator CSA
FYI zoiets heet een aanhalingsteken. :P

Ultrawide gaming setup: AMD Ryzen 7 2700X | NVIDIA GeForce RTX 2080 | Dell Alienware AW3418DW


Acties:
  • 0 Henk 'm!

  • NathanVerkerk
  • Registratie: Juli 2018
  • Laatst online: 09-07 20:57
Hahahaha ik zat inderdaad telkens al te denken: 'daar was toch een woord voor?'. Kon het woord niet bedenken😂

[ Voor 2% gewijzigd door NathanVerkerk op 10-04-2021 15:52 . Reden: spelling ]


Acties:
  • 0 Henk 'm!

  • Hero of Time
  • Registratie: Oktober 2004
  • Laatst online: 16-09 21:43

Hero of Time

Moderator LNX

There is only one Legend

Ware het niet dat Powershell niet ' (aanhalingsteken/single quote) of " (dubbel aanhalingsteken/double quote) gebruikt als escape teken, maar ` (backtick, geen idee hoe we dat in het Nederlands noemen).

Ik heb zelf nu geen Powershell bij de hand, maar kijk naar wat je zoal opvraagt en wat de werkelijke waarde is van het object dat in de variabele zit. Dan kan je daarmee werken om het fatsoenlijk aan ffmpeg door te geven. In principe heb je het allemaal al, al dan niet als eenmalige waarde om variabelen te vullen, je moet het alleen nog even op de juiste manier eruit trekken.

Iets als input: $StandaardDirectory\$BrowseVid en output: $DestinationVid\doelbestand.mp4.

Commandline FTW | Tweakt met mate


Acties:
  • 0 Henk 'm!

  • NathanVerkerk
  • Registratie: Juli 2018
  • Laatst online: 09-07 20:57
Ik bedoel het niet om te twijfelen aan je hoor. Maar als ik me goed herinner wordt de backtick toch gebruikt in powershell om een command af te maken op de volgende regel? Of heb ik me dat verkeerd herinnerd?

Acties:
  • 0 Henk 'm!

  • Hero of Time
  • Registratie: Oktober 2004
  • Laatst online: 16-09 21:43

Hero of Time

Moderator LNX

There is only one Legend

Twijfelen aan wat iemand zegt is goed, dat zorgt er alleen maar voor dat je zelf nadenkt of wat er gezegd wordt klopt en dan ga je uitzoeken hoe het zit met betere bronnen. Mijn specialiteit ligt meer bij Linux, daar had ik het script al heel snel werkend gekregen (en jij ook). Powershell is echter een heel ander beest en vereist dus ook een andere manier van doen.

Zoek uit hoe je een variabele in quotes kan doorgeven als argument. Je had "$variabel" al geprobeerd, toch?

Commandline FTW | Tweakt met mate


Acties:
  • 0 Henk 'm!

  • NathanVerkerk
  • Registratie: Juli 2018
  • Laatst online: 09-07 20:57
Dankjewel voor deze mooie reactie. Ik heb inderdaad met de dubbele aanhalingstekens al geprobeerd.

Acties:
  • 0 Henk 'm!

  • NathanVerkerk
  • Registratie: Juli 2018
  • Laatst online: 09-07 20:57
Hallo allemaal! Na vandaag nog een tijdje verder te werken heb ik het werkend gekregen. Het bleek dat ik per ongeluk al een klein tijdje het verkeerde variable gebruikte - dom foutje!
Na dat ontdekt te hebben werkte het gewoon om het variabel neer te zetten zoals $input.filename. Werkt perfect! Alles converteert zoals het hoort, en ik kan weer verder! Dank voor alle hulp!
Pagina: 1