Invece di utilizzare -ss
e -to
cercare parametri, che non sembrano molto precisi, posso tagliare video per determinati numeri di frame? Per esempio;
ffmpeg -i video.webm -startingframe 80 -endingframe 560 output.webm
[80 ° telaio e 560 ° telaio inclusi. Quindi, come totale fa (560-80 +1) fotogrammi]
Dopo le risposte e un po 'di ricerca, ho provato alcuni comandi. Ma finora non sono riuscito a trovare un modo accettabile.
Se qualcuno vuole tagliare il flusso video tra 250 ° e 750 ° fotogrammi, questa è la strada da percorrere. Fornirà 501 frame come output:
Nota: movie.mp4 ha 25 fps e la sua frequenza di campionamento audio è 48k
ffmpeg -i movie.mp4 -an -vf "select=between(n\,250\,750),setpts=PTS-STARTPTS" v_stream.webm
Come previsto, l'output dura esattamente 20 secondi.
Utilizzando lo stesso metodo per l'audio:
ffmpeg -i movie.mp4 -vn -af "aselect=between(n\,480\,1440),setpts=PTS-STARTPTS" a_stream.webm
Inaspettatamente, questo ha una precisione molto scarsa. Avrebbe dovuto darmi 960001 (960k + 1) campioni che equivalgono a 20 secondi di audio. Invece, l'output era lungo 20.505 secondi e ha 984240 campioni. Inoltre, se aumento la durata, aumenta anche l'errore.
Quindi ho provato a usare i parametri -ss -to per tagliare il flusso audio:
ffmpeg -i movie.mp4 -vn -ss 10.000 -to 30.000 a_stream.webm
Il vecchio modo classico funziona molto meglio. L'output è durato 20,003 secondi e ha 960144 campioni. Inoltre, l'aumento della durata non aumenta l'errore, l'errore è costante, c'è sempre un surplus di 144 campioni con quel file di input.
Riassumendo: il
select
filtro funziona bene la maggior parte delle volte ma una selezione no. I -ss
parametri classici funzionano meglio per l'audio ma non sono accurati. Inoltre, non è possibile utilizzare -vf select
e -ss
parametri insieme, poiché -ss
influenzerà sia i flussi audio che video mentre noi vogliamo che influisca solo sull'audio.
Quindi, per tagliare con precisione un file multimediale, devo eseguire questi 3 passaggi:
ffmpeg -i movie.mp4 -an -vf "select=between(n\,250\,750),setpts=PTS-STARTPTS" v_stream.webm
ffmpeg -i movie.mp4 -vn -ss 10.000 -to 30.000 a_stream.webm
ffmpeg -i v_stream.webm -i a_stream.webm -c:v copy -c:a copy movie-between_10th_and 20th_seconds.webm
Questo dà i risultati più accurati. Il video ha una durata di 20.000 secondi e un audio accurato per fotogrammi è lungo 20.003 secondi e ha un campione di 960144. Non corrisponde esattamente al flusso video, ma è OK. C'è un surplus di soli 144 campioni. Il più grande svantaggio è, ogni volta che voglio tagliare un file, devo inviare 3 comandi per un semplice lavoro e crea due file non necessari: a_stream.webm e v_stream.webm. E il select
filtro non funziona su alcuni file di input che ho provato. Fa il lavoro con successo (?) Ma non arresta mai il processo di codifica, quindi devo chiudere il prompt dei comandi ogni volta.
select
e aselect
filtri per flussi video e audio. Select
è accurato per i fotogrammi per i video, ma aselect
non accurato per i campioni. In realtà è tutt'altro che preciso. Dà risultati molto peggiori rispetto all'utilizzo dei semplici -ss
-to
parametri. Per questo motivo , per ora, utilizzo una combinazione di select
filtro e -ss
-to
parametri per ottenere un taglio più accurato. Ma è un modo sgangherato per farlo. Per favore, guarda il mio primo post, ho aggiunto alcune