2015-06-22 38 views
11

Volevo impostare l'intervallo di fotogrammi chiave di un video di input su 5 secondi. Solo così posso ottenere una segmentazione HLS costante di 5 secondi usando FFmpeg. Come impostare l'intervallo di fotogrammi chiave su 5 secondi usando FFmpeg? (È stato apprezzato il codice di linea FFmpegcome modificare l'intervallo di fotogrammi chiave in ffmpeg

risposta

16

Avrete bisogno di ricodificare. Imposta il parametro keyint di x264 su 5 * fps e disabilita scenecut. Ad esempio, se il tuo fps è 24:

ffmpeg -i <input> -vcodec libx264 -x264-params keyint=120:scenecut=0 -acodec copy out.mp4 

Questo ovviamente non è ottimale per la qualità ma corrisponderà alla tua richiesta.

Modificato per modificare no-scenecut a scenecut=0, come da suggerimento per il ragazzo seduto.

+1

Grazie per questo ... e hai ragione, il più delle volte, scherzare con intervalli di fotogrammi chiave è fare casino con la qualità. –

+0

Avete qualche fonte che dice "se impostiamo l'intervallo dei fotogrammi chiave, qualcosa di brutto succede alla qualità"?! –

+1

Danneggia la qualità o il bitrate. Gli smart encorder posizionano fotogrammi chiave quando c'è uno scenecut in modo che i fotogrammi futuri possano avere un riferimento pulito. Se imposti l'intervallo, i fotogrammi chiave non saranno ottimali per i fotogrammi futuri e questo danneggerà il flusso generale. – Ely

9

Sigh.

La disinformazione relativa all'opzione no-scenecut è andata avanti più a lungo di quanto possa ricordare. Non inserire mai un valore per no-scenecut.

È disponibile un collegamento alla documentazione here.

Per FFmpeg è necessario utilizzare i seguenti due interruttori:

-g 120 definirà un GOP di 120 fotogrammi per creare cinque secondi GOP per 23.976fps contenuti. Questo funziona in combinazione con l'opzione no-scenecut ..

-x264opts no-scenecut costringerà i fotogrammi chiave da creare per il valore GOP utilizzato da FFmpeg. L'impostazione predefinita per libx264 è di creare un fotogramma chiave quando rileva una modifica di scena. Se controlli un file di output usando MediInfo senza questa opzione vedrai "scenecut = 40". Se fatto correttamente, sarà "scenecut = 0". Se questa opzione non viene utilizzata, i fotogrammi chiave saranno disallineati per il contenuto di ABR e le dimensioni dei segmenti saranno imprevedibili.

Non credetemi, eseguire il comando seguente in una shell bash in cui $ inputfile è il nome del file che si desidera analizzare. Se si utilizzano i due interruttori mostrati sopra, si vedrà una cadenza molto uniforme del dump dei keyframe al prompt dei comandi.

ffprobe -select_streams v -show_frames -show_entries frame=pict_type -of csv $inputfile | grep -n I | cut -d ':' -f 1 

È inoltre possibile fare riferimento a un articolo che ho scritto su come creare una corretta cornice ABR contenuti here allineati.

+0

Per la massima precisione, si dovrebbe usare 'frame = key_frame'. È possibile avere I-frame che non sono fotogrammi chiave. – Mulvya