ffmpeg - hur klipper/kapar jag bara toppen och botten på bildrutan i en video?

Permalänk
Medlem

ffmpeg - hur klipper/kapar jag bara toppen och botten på bildrutan i en video?

Hej,

Jag behöver klippa bort toppen och botten av bildrutan på en video (utan att lägga till svarta rektanglar). Videon är filmad i upplösningen 5312x2988 och jag vill "klippa" ner den till 5312x2222 och att det som syns fortfarande centrerat.

Nedan är ett exempel gjort på en stillbild från videon innan pålagd effekt:

Och efter pålagd effekt:

Om jag ska beskriva det mer alldagligt så är det som att med en sax klippa bort lika breda remsor på varsin sida om rutans horisontella mittlinje.

Med siffrorna ovan kan vi enkelt se att 766 pixlar behöver tas bort totalt i höjdled; 383 pixlar på vardera sida centrerat kring mittlinjen.

Hur gör jag bäst detta i FFmpeg?

Permalänk
Medlem
Permalänk
Medlem

Jag har inte provat, men ChatGPT säger följande:

Citat:

I have a video file with resolution 5312x2988 and I want to remove 383 pixels on the top and 383 pixels on the bottom to get a new video file with resolution 5312x2222. How can I do that using ffmpeg?

...

ffmpeg -i input_video.mp4 -vf "crop=in_w:in_h-766:0:383" -c:a copy output_video.mp4

...

Permalänk
Medlem

Sen har du praktiska begränsningar när det gäller upplösning och codecs dvs du inte kan köra vilken upplösning som helst sen vill du också generellt behålla någon form av "normal" aspect ratio.

https://www.bannerbear.com/blog/how-to-crop-resize-a-video-us... förklarar rätt bra annars

Permalänk
Medlem
Skrivet av trudelutt:

Jag har inte provat, men ChatGPT säger följande:

Testar detta. Återkommer.

Permalänk
Medlem
Skrivet av Apollo11:

Testar detta. Återkommer.

Om du vet hur många pixlar som ska beskäras och det ska tas lika mycket uppe som nere så tycker jag det är enkast att skriva det såhär:

-vf "crop=in_w-0:in_h-766"

Notera även att du inte kan göra detta utan att encodera om videon också*, så du behöver även använda en lämplig video-codec för ut-filen.

*Det går att croppa med flaggor/metadata, men det är högst oklart om det kommer stödjas vid uppspelning eller inte.

Permalänk
Medlem
Skrivet av sKRUVARN:

Om du vet hur många pixlar som ska beskäras och det ska tas lika mycket uppe som nere så tycker jag det är enkast att skriva det såhär:

-vf "crop=in_w-0:in_h-766"

Notera även att du inte kan göra detta utan att encodera om videon också*, så du behöver även använda en lämplig video-codec för ut-filen.

*Det går att croppa med flaggor/metadata, men det är högst oklart om det kommer stödjas vid uppspelning eller inte.

Finns det något sätt att köra detta kommando med minimal omkodning alternativt att hålla sig så nära den ursprungliga bitrate som källfilen har? Den har kodek H.265.

EDIT: Testar "Accept some quality loss" från detta Stack Overflow-svar:
https://stackoverflow.com/a/33422359

Permalänk
Medlem
Skrivet av Apollo11:

Finns det något sätt att köra detta kommando med minimal omkodning alternativt att hålla sig så nära den ursprungliga bitrate som källfilen har? Den har kodek H.265.

EDIT: Testar "Accept some quality loss" från detta Stack Overflow-svar:
https://stackoverflow.com/a/33422359

Kan t ex vara så att du landar på en väldigt hög level med den upplösningen och får eventuellt problem med uppspelning i vissa scenarion. Men prova, får du problem så kan du prova libx265 (hevc) istället för libx264 (avc).

Väldigt generellt med x264/x265 så ger allt under crf 20 väldigt god kvalitet, och vid runt 16 och nedåt så brukar det bli vad man kan anse vara visually lossless.

I samma stackoverflow svar har du även metadata-metoden, och skulle för dig då se ut såhär:

ffmpeg -i input.mp4 -c copy -bsf:v hevc_metadata=crop_left=0:crop_right=0:crop_top=383:crop_bottom=383 output.mp4

Dock typ aldrig stött på att det används, har faktiskt ingen aning hur stödjet för det ser ut. Videon beskärs alltså egentligen inte, utan det är då tänkt att uppspelningsmjukvaran läser metadatan och gör beskärningen vid uppspelning, i teorin iaf är det en rätt bra lösning.

Permalänk
Medlem
Skrivet av sKRUVARN:

Kan t ex vara så att du landar på en väldigt hög level med den upplösningen och får eventuellt problem med uppspelning i vissa scenarion. Men prova, får du problem så kan du prova libx265 (hevc) istället för libx264 (avc).

Väldigt generellt med x264/x265 så ger allt under crf 20 väldigt god kvalitet, och vid runt 16 och nedåt så brukar det bli vad man kan anse vara visually lossless.

I samma stackoverflow svar har du även metadata-metoden, och skulle för dig då se ut såhär:

ffmpeg -i input.mp4 -c copy -bsf:v hevc_metadata=crop_left=0:crop_right=0:crop_top=383:crop_bottom=383 output.mp4

Dock typ aldrig stött på att det används, har faktiskt ingen aning hur stödjet för det ser ut. Videon beskärs alltså egentligen inte, utan det är då tänkt att uppspelningsmjukvaran läser metadatan och gör beskärningen vid uppspelning, i teorin iaf är det en rätt bra lösning.

Håller på att testa med "-crf" runt 16-17 som ni råder, jag tänkte även på att skriva "libx265". Renderar nu.

Permalänk
Medlem

Kommandot jag kör:

ffmpeg -i [input].MP4 -vf "crop=in_w-0:in_h-766" -c:v libx265 -crf [crf_value] -c:a copy [output].MP4

Om jag fattat rätt så säger "crop=in_w-0:in_h-766" typ såhär:
"Lämna video-bredden orörd och subtrahera 766 pixlar från video-höjden. Eftersom inga x och y-koordinater angetts kapas lika många pixlar på vardera sida om mittlinjen."