taglio accurato di video (+ audio) con ffmpeg


10

Voglio che il mio sito Web consenta agli utenti di creare accuratamente i propri clip da un video sorgente che fornisco.

Ho un file video sorgente che voglio prima convertire in qualcosa adatto a un sito Web:

Input #0, matroska,webm, from 'source.mkv': 
Duration: 00:28:18.57, start: 0.000000, bitrate: 10183 kb/s 
Stream #0:0: Video: h264 (Constrained Baseline), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 23.98 fps, 23.98 tbr, 1k tbn, 48 tbc (default)
Stream #0:1: Audio: mp3, 44100 Hz, stereo, s16, 128 kb/s (default)

Uso ffmpeg per convertirlo in questo modo:

ffmpeg -i source.mkv -c:v libx264 -c:a aac -strict experimental -vf scale="960:-1" source.mp4

Guardando indietro questo video, è di qualità abbastanza buona e dimensioni del file abbastanza piccole per le mie esigenze, e carica / riproduce sul mio sito web.

Ho una pagina web che consente agli utenti di selezionare un inizio e un endpoint in questo video e creare una clip. Ecco un esempio del comando ffmpeg che uso per questo:

-ss 577.920 -i source.mp4 -t 011.980 -codec:v copy -codec:a copy -vf scale="960:-1" clip1.mp4

Il problema è che la clip non è sempre abbastanza precisa nel tempo. Di solito l'audio è abbastanza preciso ma il video si interrompe mezzo secondo prima o qualcosa del genere.

C'è un modo per rendere questo preciso e sincronizzato per dire, 0,2 di secondo?

EDIT: l'aggiunta -force_key_frames 00:00:00.2non ha aiutato.

EDIT: ho cambiato il ritaglio da usare -c:v libx264 -c:a aac -strict experimentalinvece che -codec:v copy -codec:a copycon buoni risultati (ish).

Il file può essere riprodotto esternamente senza problemi, ma quando lo carico nell'elemento video html5 e lo riproduco, l'ultima parte del video (l'audio va bene) si blocca. L'ultima parte che si blocca è lunga meno di un secondo.

Dovrei provarlo con un altro codificatore video? Qual è la migliore alternativa a libx264? Tenendo presente che probabilmente vorrò che questo fosse su un sito Web pubblico.

Ma resisti, il fatto che venga riprodotto accuratamente senza problemi con un lettore come MPC o Windows Media Player suggerisce che si tratta di un problema con Google Chrome o l'elemento video HTML? O sto usando una codifica non supportata o qualcosa del genere?


Ciò potrebbe avere a che fare con la tempistica dei fotogrammi chiave. In ogni caso, questo dovrebbe essere spostato su SuperUser.com.
Brad,

Ciao, ffmpeg non può tagliare il video in nessun momento, può solo tagliare i fotogrammi chiave; per questo motivo l'audio è quasi preciso, mentre il video no.

Posso spostarlo da solo? Proverò ad aggiungere fotogrammi chiave al file sorgente con -force_key_frames 00: 00: 00.2
Pete Oakey,

Risposte:


9

Il comportamento -sscambia in base all'utilizzo come opzione di input o output ed è spesso più lento ma può essere più preciso se utilizzato come opzione di output. Vedi la risposta a ffmpeg converte lentamente il video del periodo di tempo specificato per maggiori dettagli ed esempi.

Per modificare la qualità di output per source.mp4utilizzare l' -crfopzione con un valore tra 18-28 (23 è l'impostazione predefinita). Vedere la sezione CRF della Guida alla codifica FFmpeg e x264 per esempi.

Il comando di taglio può essere semplificato:

ffmpeg -ss 577.92 -i source.mp4 -ss 0 -t 11.98 -c copy -map 0 clip1.mp4

Ho sostituito -codec:v copy -codec:a copycon -c copy -map 0. Questo copierà tutti i flussi anziché solo i primi flussi video e audio, sebbene l'ingresso abbia solo due flussi a causa del comando precedente. Dal momento che non è possibile ridimensionare senza ricodifica, pertanto essendo reciprocamente esclusivi -codec:v copye poiché l'input è già ridimensionato alla dimensione impostata, ho rimosso le opzioni di filtro.

Se non è ancora abbastanza preciso, prova:

ffmpeg -i source.mp4 -ss 577.92 -t 11.98 -c copy -map 0 clip1.mp4

Sarà più lento, ma probabilmente più preciso. Vedi i link nella risposta nel primo link che ho fornito per una descrizione delle differenze di questi due esempi.

Infine, si dovrebbe correre source.mp4attraverso qt-faststart(che si trova nella directory di strumenti di origine ffmpeg), o utilizzare l' -movflags faststartopzione. Questo trasferirà alcuni dati all'inizio del file in modo che possa iniziare la riproduzione prima che sia completamente scaricato.


+1 per i suggerimenti ma ho provato ffmpeg -i source.mp4 -ss 577.92 -t 011.980 -c copia -map 0 clip1.mp4 ma la prima parte (quasi un secondo) e l'ultima parte (forse un quarto di secondo) del il video è mancato, ma l'audio va bene.
Pete Oakey,

@PeteOakey Hai provato a tagliare senza una copia bitstream, ma una vera ricodifica?
slhck,

Ho provato senza copia bitstream - i risultati sono stati aggiunti alla mia domanda.
Pete Oakey,

3
L'uso -ssdell'opzione di output anziché dell'opzione di input ha risolto il mio problema: il primo fotogramma video era di circa 1 secondo nel video di output, con solo l'audio prima (confermato anche da ffprobe -show_frames). Muovendosi -ssdopo, -iha emesso frame audio e video a partire dal frame 0.
CodeManX
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.