Batch converte H.265 mkv in H.264 con ffmpeg per rendere i file compatibili per la ricodifica

21

Ho file codificati H.265 che sono così ricchi di risorse che non giocano bene e il mio software di conversione (mencoder) non supporta (attualmente) il formato H.265. Posso convertirli in H.264 in un file batch da riga di comando per convertire rapidamente i file per la ri-compressione usando Devede / OGMrip? Durante la ricerca di questo sito non l'ho trovato discusso, quindi posterò quello che ritengo sia una domanda utile e la risposta alla domanda.

    
posta TheMegolith 08.12.2015 - 17:08

2 risposte

27

Sì, utilizzando ffmpeg .

Apri un terminale e indirizzalo alla directory contenente i file codificati H.265, assumendo che tu abbia ffmpeg e le librerie appropriate installate e assumendo che siano in formato MKV copia e incolla quanto segue nella finestra del terminale.

INPUT=""
for i in *.mkv ; do
    ffmpeg -i "$i" -bsf:v h264_mp4toannexb -sn -map 0:0 -map 0:1 -vcodec libx264 "$i.ts"
    mv "$i.ts" "$i.mpg"
    sleep 3
done

Ce l'hai. Questo convertirà in h.264 in un contenitore MPG nella stessa directory.

Spiegazione degli switch di comando:

  • for i in *.mkv ; do ... done

    Questo imposta tutti i file .mkv in una directory da includere nel processo batch. Questo può essere modificato per adattarsi all'estensione del contenitore dei file che desideri elaborare.

  • ffmpeg -i "$i" Esegue il programma ffmpeg e richiede l'elaborazione dei file.

    • -bsf:v attiva il filtro del flusso di bit video da utilizzare.

    • h264_mp4toannexb - È il filtro flusso di bit che è attivato.

      Convertire un flusso di bit H.264 dalla modalità con prefisso di lunghezza per avviare la modalità con prefisso del codice (come definito nell'allegato B della specifica H.264 ITU-T).

      Questo è richiesto da alcuni formati di streaming, in genere il formato del flusso di trasporto MPEG-2 ( mpegts ) che processa MKV h.264 (al momento) richiede questo, se non è incluso si otterrà un errore nella finestra del terminale che ti istruisce per usarlo.

    • -sn interrompe lo streaming dei flussi di sottotitoli (per quelli che non vogliono i sottotitoli nei loro video) Questo è facoltativo e può essere rimosso.

    • -map 0:0 -map 0:1 Indica a ffmpeg di elaborare solo i primi due flussi del file ( 0:0 è il flusso video, 0:1 è il primo flusso audio del file). Questo fa due cose, elimina i flussi audio in eccesso, di solito il primo flusso audio è in inglese ma non sempre. Altri flussi come i sottotitoli incorporati vengono rimossi riducendo la dimensione del file. Questa è anche una stringa opzionale. Puoi utilizzare ffprobe per visualizzare gli stream disponibili nel file. -map è facoltativo e può essere scartato dal comando.

    • -vcodec libx264 Questo dice a ffmpeg di codificare l'output in H.264

    • "$i.ts" Salva l'output in formato .ts, questo è utile per non sovrascrivere i file sorgente.

  • mv "$i.ts" "$i.mpg" Converte l'estensione del file in MPG nella stessa directory. Questo può essere impostato per inviarlo a qualsiasi directory che ti piace.

  • sleep 3 - consente al processo di fermarsi dando tempo ffmpeg per accodare il file successivo

risposta data TheMegolith 08.12.2015 - 17:09
12

Conversione batch da H.265 a H.264

Questi esempi sono stati scritti per il recente ffmpeg . Salvati qualche problema e scarica una versione recente. Quindi metti il ffmpeg binario in ~/bin o /usr/local/bin (potresti dover disconnettersi e fare il login perché venga notato).

Output di Matroska

mkdir h264vids
for f in *.mp4; do ffmpeg -i "$f" -map 0 -c copy -c:v libx264 -crf 23 -preset medium h264vids/"${f%.*}.mkv"; done
  • Questo esempio verrà generato in una directory denominata h264vids .

  • Questo esempio presuppone che i tuoi input siano .mp4 . In caso contrario, modifica l'istanza .mp4 nell'esempio al tuo tipo di file di input, oppure usa solo l'avido * di per sé.

  • Regola -crf per la qualità e -preset per la velocità / efficienza di codifica. O semplicemente rimuovi queste opzioni e usa i valori di default che sono abbastanza buoni e dovrebbero essere sufficienti per la maggior parte (l'esempio usa i valori predefiniti per queste opzioni). Vedi Wiki FFmpeg: H.264 per maggiori informazioni su queste opzioni.

Uscita MP4

Questo è un po 'più complicato. Questo eseguirà la codifica condizionale a seconda che l'audio in ingresso sia AAC o meno. Se l'audio in ingresso è AAC, l'audio sarà copiato in streaming (re-muxed) così com'è e si eviterà la ricodifica inutile. Se l'audio in ingresso è non AAC, verrà ricodificato in AAC.

Ecco un semplice script che mostra come eseguire ciò utilizzando ffprobe e ffmpeg . Copia e salva nella directory contenente i tuoi video da convertire, dagli il permesso di esecuzione con chmod +x yourscriptname , quindi eseguilo con ./yourscriptname .

#!/bin/bash

audioformat=$(ffprobe -loglevel error -select_streams a:0 -show_entries stream=codec_name -of default=nw=1:nk=1 "$f")

mkdir h264vids

for f in *.mkv
do
  if [ "$audioformat" = "aac" ]; then
    ffmpeg -i "$f" -c:v libx264 -crf 23 -preset medium -c:a copy -movflags +faststart h264vids/"${f%.*}.mp4"
  else
    ffmpeg -i "$f" -c:v libx264 -crf 23 -preset medium -c:a aac -movflags +faststart h264vids/"${f%.*}.mp4"
  fi
done
  • Questo esempio verrà generato in una directory denominata h264vids .

  • Questo esempio presuppone che i tuoi input siano .mkv . In caso contrario, modifica l'istanza .mkv nell'esempio al tuo tipo di file di input, oppure usa solo l'avido * di per sé.

  • Vedi la nota precedente per quanto riguarda -crf e -preset .

  • Puoi mettere in pausa la codifica con ctrl + z e riprendere con fg .

risposta data LordNeckbeard 25.09.2017 - 01:20

Leggi altre domande sui tag