2010-05-06 14:12:17 +0000 2010-05-06 14:12:17 +0000
357
357

Met behulp van ffmpeg om video

te knippen gebruik ik ffmpeg om een deel van een groot bestand als dit uit te knippen:

ffmpeg -i input.wmv -ss 60 -t 60 -acodec copy -vcodec copy output.wmv

Het -ss deel werkt prima, maar de -t wordt genegeerd. Het verwijdert de initiële opgegeven seconden die met -ss zijn opgegeven correct, maar gaat dan door naar het einde van de invoer met de kopie.

Is er een manier om ffmpeg te gebruiken om het einde van een video af te knippen zonder deze te hercoderen?

Antwoorden (7)

105
105
105
2014-01-20 04:07:24 +0000

Zoals andere mensen al zeiden, maakt het zetten van -ss voor (veel sneller) of na (veel nauwkeuriger) de -i een groot verschil. De sectie “Fast And Accurate Seeking” op de ffmpeg seek pagina vertelt je hoe je beide kunt krijgen, en ik heb het gebruikt, en het maakt een groot verschil. In principe zet je -ss voor EN na de -i, zorg er dan voor dat je genoeg tijd overhoudt voordat je begint te knippen om een ander sleutelkader te hebben. Voorbeeld: Als u een clip van 1 minuut wilt maken, van 9min0sec tot 10min 0sec in Video.mp4, kunt u dit zowel snel als nauwkeurig doen met:

ffmpeg -ss 00:08:00 -i Video.mp4 -ss 00:01:00 -t 00:01:00 -c copy VideoClip.mp4

De eerste -ss zoekt snel naar (ongeveer) 8min0sec, en dan de tweede -ss zoekt nauwkeurig naar 9min0sec, en de -t 00:01:00 haalt een clip van 1min0sec eruit.

Noteer ook dit belangrijke punt van die pagina: “Als je -ss gebruikt met -c:v copy, kan de resulterende bitstream ruw, niet afspeelbaar of niet gesynchroniseerd zijn met de audiostream, omdat ffmpeg gedwongen wordt alleen op i-frames te gebruiken/splitsen.”

Dit betekent dat je de video opnieuw moet coderen, zelfs als je hem gewoon wilt kopiëren, of het risico loopt dat hij ruw en niet gesynchroniseerd is. Je zou eerst gewoon -c copy kunnen proberen, maar als de video klote is, moet je het opnieuw doen.

27
27
27
2014-05-09 02:24:58 +0000

Ik vond dat -ss in combinatie met -c copy resulteerde in een halve-seconde hakbeurt aan het begin.

Om dat te voorkomen, moet je de -c copy verwijderen (die weliswaar een transcode zal doen).

13
13
13
2014-09-04 05:48:57 +0000

MANUALLY

Open het bestand in een mediaspeler die frame per frame vooruit gaat en speel een AVISynth bestand af met gegevens zoals:

DirectShowSource(("C:\Downloads\Video\Do you want him.flv"), Pixel_Type="yuy2").Crop(0,0,-0,-0)
Subtitle("C:\Downloads\Video\Do you want him.flv", font="Arial", size=24, text_color=$ff0000, align=3)
ShowFrameNumber(scroll=true, x=336, y=27, font="Arial", size=24, text_color=$ff0000)
ShowTime(x=398, y=44, font="Arial", size=24, text_color=$ff0000)

en knip dan met het EXACTETETEURS tijdsformaat:

ffmpeg -i "Path\do you want him.flv" \
       -ss 00:00:05.240 -to 00:00:08.360 \
       -vcodec libx264 -acodec libvo_aacenc \
       "Path\Do you want him1.flv"

en

ffmpeg -i "Path\do you want him.flv" \
       -ss 00:00:10.240 -to 00:00:14.360 \
       -vcodec libx264 -acodec libvo_aacenc \
       "Path\Do you want him2.flv"

maken nu een txt-bestand met de videobestanden met inhoud als:

file 'C:\Downloads\Video\Do you want him1.flv'
file 'C:\Downloads\Video\Do you want him2.flv'

Run ffmpeg:

ffmpeg -f concat -i FileList.txt -c copy "Path\NewName_joined.flv"
``` &001
8
8
8
2013-05-19 03:14:56 +0000

Voor mij werkte -t optie niet, maar -vframes werkte wel. Ik geef de voorkeur aan het gebruik van #frames, omdat ik liever bij I-Frames zou knippen en ik heb GOP ontdekt voor video met ffprobe.

De opdrachtregel die voor mij werkte is:

ffmpeg -ss 60s -i input.wmv -vframes 1800 -acodec copy -vcodec copy output.wmv

. Overigens maakt het plaatsen van -ss voor -i een groot verschil in de uitvoeringstijd.

5
5
5
2016-12-08 11:24:57 +0000

Net als bij user225366 werkt de -t optie niet voor korte video’s, maar wel voor langere video’s. Voor korte video’s lijkt het erop dat -frames:v beter is. Dit is wat voor mij werkte.

ffmpeg -ss 4 -i input.mp4 -frames:v 200 -vcodec copy output.mp4

-acodec kopie moet worden toegevoegd als de video audio heeft, zoals de andere antwoorden laten zien.

0
0
0
2020-02-12 02:20:00 +0000

gebruik dit formaat:

ffmpeg <start time> <input file> <cut duration> <out file>

bv. knip 60 seconden lang na 1 minuut video

ffmpeg.exe -ss 00:01:00 -i "in file.mp4" -to 00:01:00 -c copy out.mp4

0
0
0
2019-09-01 05:29:02 +0000

Ik zie dat niet veel mensen dit vermelden (ik ben geen expert dus misschien is er een addertje onder het gras), maar als je bestand andere streams heeft zoals ondertitels en andere metadata zoals hoofdstukken en zo verder, is het mogelijk om alle streams te knippen/trimmen en te bewaren met het volgende commando

ffmpeg -to 60 -i input.mkv -map 0 -c copy output.mkv

Met -map 0 neem je alle streams in het bestand, en met -c copy kopieer je ze allemaal zoals ze zijn.
Met -to wordt het begin via -ss weggelaten en wordt de invoervideo van begin tot tweede 60 geknipt.

Knoeien met map is ook handig als je alleen specifieke streams in de knip wilt hebben (misschien heb je niet alle audiobronnen in het bestand nodig, of alleen enkele ondertitels).

Ik gebruik dit als ik grote MKV bestanden moet splitsen die niet in de FAT32-opslag kunnen worden opgeslagen.