Taglio di video in fotogrammi esatti con il filtro di selezione ffmpeg


16

Invece di utilizzare -sse -tocercare 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 selectfiltro funziona bene la maggior parte delle volte ma una selezione no. I -ssparametri classici funzionano meglio per l'audio ma non sono accurati. Inoltre, non è possibile utilizzare -vf selecte -ssparametri insieme, poiché -ssinfluenzerà 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 selectfiltro 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.


Ho letto quella pagina prima di pubblicare questa domanda. Quella pagina non mi ha aiutato. Se un input ha fps variabili possiamo semplicemente calcolare usando quell'equazione? Non la penso così. Inoltre, non penso che '-ss' mi dia una posizione precisa. La ricerca fotogramma per fotogramma sarebbe meglio immagino.
destor

Nota che -ssè preciso al frame (vedi qui ). Hai effettivamente input a fps variabile? La mia risposta si collega al thread della mailing list che menziona l'utilizzo di selectfiltri in cui è possibile specificare il numero di frame. Ci hai provato?
Slhck,

Ho provato a utilizzare selecte aselectfiltri per flussi video e audio. Selectè accurato per i fotogrammi per i video, ma aselectnon accurato per i campioni. In realtà è tutt'altro che preciso. Dà risultati molto peggiori rispetto all'utilizzo dei semplici -ss -toparametri. Per questo motivo , per ora, utilizzo una combinazione di selectfiltro e -ss -toparametri per ottenere un taglio più accurato. Ma è un modo sgangherato per farlo. Per favore, guarda il mio primo post, ho aggiunto alcune
linee di

versione ffmpeg?
Fie

Perché stai cercando di tagliare comunque un numero di frame. Se uno ha bisogno di quel tipo di precisione, allora perché non usare avidemux? Inoltre, forse i tuoi problemi originali sono perché seleziona il fotogramma chiave più vicino?
Fie

Risposte:


3

L'audio viene dai secondi, non dai frame, quindi se vuoi tagliare un video devi calcolare i video fps × 20 secondi in questo modo: 20 secondi di 23,97 fps = 479,4

Il taglio dei fotogrammi non è preciso perché non è possibile ottenere fps completi per l'ultimo secondo, quindi l'audio avrà più secondi o solo mezzo secondo o un po 'più o meno! Forse dovresti usare i secondi invece dei fotogrammi per ottenere il taglio esatto che dici a ffmpeg di farlo per te. E se ottieni 1 fotogramma extra, che ne dici di cambiare i fotogrammi 250 ° e 750 ° in 250 ° e 749 ° ?! Usa meno 1 lì per ottenere sempre quanti fotogrammi chiedi!


In realtà l'audio proviene da campioni, non da secondi ...
Anubioz,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.