Toplu yeniden kodlama için uygun dosyaları yapmak için ffmpeg ile H.265 mkv'yi H.264'e dönüştürün

22

H.265 kodlanmış, çok iyi kaynak almayan dosyalarım iyi oynamıyorlar ve dönüştürme yazılımım (mencoder) H.265 formatını desteklemiyor (şu anda). Devede / OGMrip kullanarak dosyaları yeniden sıkıştırma için hızlıca dönüştürmek için bir komut satırı toplu iş dosyasında H.264'e dönüştürebilir miyim? Bu siteyi aradıktan sonra tartışılan şeyi bulamadım, bu yüzden ne hissettiğimi göndereceğim ve soruya faydalı bir soru ve cevap vereceğim.

    
sordu TheMegolith 08.12.2015 17:08

2 cevap

27

Evet, ffmpeg .

kullanarak.

Bir terminali açın ve H.265 kodlu dosyaları içeren dizine yönlendirin, ffmpeg 'sine sahip olduğunuz ve uygun kütüphanelerin yüklendiğini ve MKV formatında olduklarını varsayarak aşağıdakileri kopyalayıp terminal penceresine yapıştırdığınızı varsayalım.

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

İşte orada var. Bu, aynı dizinde bir MPG kapsayıcısında h.264'e dönüşecektir.

Komut anahtarlarının açıklaması:

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

    Bu, toplu işlemde yer alacak bir dizindeki tüm .mkv dosyalarını ayarlar. Bu işlem, işlemek istediğiniz dosyaların kapsayıcısını kapsayacak şekilde değiştirilebilir.

  • ffmpeg -i "$i" Program ffmpeg'i yürütür ve işlenecek dosyaları çağırır.

    • -bsf:v , kullanılacak video bit akışı filtresini etkinleştirir.

    • h264_mp4toannexb - Etkinleştirilmiş bit akışı filtresi.

      Kod öneki modunu başlatmak için H.264 bit akışını uzunluk önekli moddan dönüştürün (ITU-T H.264 belirtiminin Ek B'sinde tanımlandığı gibi).

      Bu, bazı akış formatları tarafından gereklidir, tipik olarak MPEG-2 aktarım akışı formatı ( mpegts ) işlemesi MKV h.264 (şu anda) gerektirir, eğer dahil edilmediyse terminal penceresinde size talimat veren bir hata alırsınız. kullanmak için.

    • -sn , altyazı akışlarının akışını durdurur (videolarında altyazı istemeyenler için) Bu isteğe bağlıdır ve kaldırılabilir.

    • -map 0:0 -map 0:1 ffmpeg'e, yalnızca dosyanın ilk iki akışını işlemesini söyler ( 0:0 , video akışıdır, 0:1 , dosyanın ilk ses akışıdır). Bu iki şey yapar, aşırı ses akışlarını keser, genellikle ilk ses akışı İngilizce'dir ancak her zaman değildir. Gömülü altyazılar gibi diğer akışlar, dosya boyutunu azaltarak kaldırılır. Bu ayrıca isteğe bağlı bir dizedir. Dosyada bulunan akışları görüntülemek için ffprobe değerini kullanabilirsiniz. -map isteğe bağlıdır ve komuttan çıkarılabilir.

    • -vcodec libx264 Bu, ffmpeg'in çıkışı H.264'e kodlamasını söyler

    • "$i.ts" Çıktıyı .ts biçimine kaydeder, bu da kaynak dosyalarınızın üzerine yazmamak için kullanışlıdır.

  • mv "$i.ts" "$i.mpg" Dosya uzantısını aynı dizinde MPG'ye dönüştürür. Bu, istediğiniz herhangi bir dizine göndermek için ayarlanabilir.

  • sleep 3 - işlemin bir sonraki dosyayı sıraya koymak için ffmpeg zamanını vermesine izin verir.

verilen cevap TheMegolith 08.12.2015 17:09
13

H.265’ten H.264’e toplu dönüşüm

Bu örnekler, son ffmpeg için yazılmıştır. Kendinize biraz sorun kaydedin ve son sürümü indirin . Ardından, ffmpeg binary'sini ~/bin veya /usr/local/bin dizinine koyun (oturumu kapatmanız ve sonra dikkat edilmesi için oturum açmanız gerekebilir).

Matroska çıkışı

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
  • Bu örnek, h264vids adlı bir dizine gönderilecek.

  • Bu örnek, girişlerinizin .mp4 olduğunu varsayar. Değilse, örnekte bulunan .mp4 örneğini giriş dosya türünüze dönüştürün veya yalnızca * açgözlü ifadesini kullanın.

  • Kodlama hızı / verimliliği için kalite için -crf ve -preset değerini ayarlayın. Ya da sadece bu seçenekleri kaldırın ve oldukça iyi olan ve çoğu için yeterli olan varsayılan değerleri kullanın (örnek bu seçenekler için varsayılan değerleri kullanmaktadır). Bu seçenekler hakkında daha fazla bilgi için FFmpeg Wiki: H.264 sayfasına bakın.

MP4 çıkışı

Bu biraz daha karmaşık. Bu, giriş sesinin AAC olup olmamasına bağlı olarak koşullu kodlamayı gerçekleştirecektir. Eğer giriş sesi AAC ise o zaman ses akış olarak kopyalanacak (yeniden müptela) olacak ve gereksiz yeniden kodlama önlenecektir. Giriş sesi değil AAC ise, AAC'ye yeniden kodlanır.

İşte, ffprobe ve ffmpeg kullanarak bunu nasıl yapacağınızı gösteren basit bir komut dosyası. Kopyalanacak ve dönüştürülecek videolarınızı içeren dizine kaydedin, chmod +x yourscriptname ile yürütme izni verin, ardından ./yourscriptname ile çalıştırın.

#!/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
  • Bu örnek, h264vids adlı bir dizine gönderilecek.

  • Bu örnek, girişlerinizin .mkv olduğunu varsayar. Değilse, örnekte bulunan .mkv örneğini giriş dosya türünüze dönüştürün veya yalnızca * açgözlü ifadesini kullanın.

  • Yukarıdaki -crf ve -preset ile ilgili nota bakın.

  • Kodlamayı ctrl + z ile duraklatabilir ve fg ile devam edebilirsiniz.

verilen cevap LordNeckbeard 25.09.2017 01:20

Etiketlerdeki diğer soruları oku