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.