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


31

Kaynak yoğunluğu çok iyi olan H.265 kodlanmış dosyalarım var, iyi çalmıyorlar ve dönüştürme yazılımım (mencoder) H.265 biçimini desteklemiyor. Dosyaları Devede / OGMrip kullanarak yeniden sıkıştırmak üzere hızlıca dönüştürmek için komut satırındaki toplu iş dosyasında H.264'e dönüştürebilir miyim? Bu siteyi araştırdıktan sonra tartışmamıştım, bu yüzden faydalı bir soru ve sorunun cevabını düşündüğümü göndereceğim.

Yanıtlar:


37

Evet, kullanarak ffmpeg.

Bir terminal açın ve H.265 kodlu dosyaları içeren dizine yönlendirin, varsayalım ffmpegve uygun kitaplıklar varsayalım ve bunların MKV biçiminde olduğunu varsayarak kopyalayın ve aşağıdakileri terminal penceresine yapıştırın.

INPUT="$1"
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 aldın. Bu, aynı dizindeki bir MPG kabındaki h.264'e dönüştürülür.

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

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

    Bu, tüm .mkv dosyalarını toplu işleme dahil edilecek bir dizindeki ayarlar. Bu, işlemek istediğiniz dosyaların konteyner uzantısına uyması için değiştirilebilir.

  • ffmpeg -i "$i" Ffmpeg programını çalıştırır ve işlenecek dosyaları çağırır.

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

    • h264_mp4toannexb - Etkinleştirilmiş olan bit akış filtresidir.

      Ön kod modunu başlatmak için uzunluk ön ek modundan bir H.264 bit akışını dönüştürün (ITU-T H.264 teknik özellikleri ek B'de tanımlandığı gibi).

      Bu, bazı akış formatları için gereklidir, tipik olarak mpegtsMKV h.264'ü (şu anda) işleyen MPEG-2 taşıma akış formatı ( ) bunu gerektirir, eğer dahil değilse, terminal penceresinde kullanmanız için talimat veren bir hata alırsınız.

    • -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:1Ffmpeg'e dosyanın yalnızca ilk iki akışını işlemesini söyler ( 0:0video akışıdır, 0:1dosyanın ilk ses akışıdır). Bu iki şey yapar, aşırı ses akışlarını çıkarır, genellikle ilk ses akışı İngilizce'dir ancak her zaman değil. Gömülü altyazılar gibi diğer akışlar, dosya boyutunu küçülterek kaldırılır. Bu aynı zamanda isteğe bağlı bir dizedir. ffprobeDosyada mevcut akışları görüntülemek için kullanabilirsiniz . -mapisteğe bağlıdır ve komuttan atılabilir.

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

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

  • mv "$i.ts" "$i.mpg"Dosya uzantısını aynı dizindeki 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 koyması için ffmpeg zamanının dinlenmesini sağlar


3
Mükemmel! Şimdi sorunun altındaki yorumları silebiliriz. sleep 3Gereksiz olduğunu (ancak döngüyü sonlandırmak için faydalı olabilir) ve INPUT=$1bunu doğrudan etkileşimli bir kabukta çalıştırdığınız için anlamsız olduğunu söyleyebilirim .
muru

11
Sesi yeniden kodlamak yerine kopyalarken düşünün -c:a copy. Ayrıca, 0:0her zaman videoya atıfta bulunmayabilir ve 0:1her zaman sese atıfta bulunmayabilir. Potansiyel sorunlardan kaçınmak için bir akış belirteci kullanabilirsiniz: -map 0:v -map 0:agiriş 0'dan tüm video ve ses akışlarını -map 0:v:0 -map 0:a:0istiyorsanız veya giriş 0'dan yalnızca ilk video ve ses akışlarını istiyorsanız, yalnızca İngilizce ses akışını istiyorsanız: -map 0:m:language:eng(varsayarak) etiketli).
20

1
@ LordNeckbeard Size tam bir cevap yazmak için oy vereceğim.
Fran Marzoa

1
@Fran Bu yorumla ilgili çok fazla oy vardı. Daha basit, daha az hata eğilimli ve daha verimli yöntemler kullanarak bir cevap ekledim .
llogan

1
Tamamen basitçe giderdim ffmpeg -i $INPUT -vcodec h264 -acodec copy $OUTPUT. Her gün kullandığım ve aslında her ffmpeg cevabının rezil olduğu anlamsız bayrakların barajının aksine ezberleyebildiğim bir şey.
Ben Sinclair

20

H.265’in H.264’e toplu dönüştürme

Bu örnekler son zamanlarda yazılmıştır ffmpeg. Kendine biraz sıkıntıdan sakın ve yeni bir sürümü indir . Sonra ffmpegikili dosyayı girin ( ~/binveya /usr/local/binoturumu kapatmanız gerekebilir, daha sonra fark edilmesi için giriş yapın).

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 adlı bir dizine çıkacaktır h264vids.

  • Bu örnekte girdilerinizin olduğu varsayılmaktadır .mp4. Değilse .mp4, örnekteki örneği giriş dosyası türünüzle değiştirin veya açgözlülüğü yalnızca kullanın *.

  • -crfKalite ve -presetkodlama hızı / verimliliği için ayarlayın . Veya bu seçenekleri kaldırın ve oldukça iyi olan ve çoğu için yeterli olan varsayılanları kullanın (örnek, bu seçenekler için varsayılan değerleri kullanıyor). Bu seçeneklerle ilgili daha fazla bilgi için FFmpeg Wiki: H.264'e bakınız .

MP4 çıkışı

Bu biraz daha karmaşık. Bu, giriş sesinin AAC olup olmamasına bağlı olarak koşullu kodlamayı gerçekleştirir. Giriş sesi AAC ise, ses akışı olduğu gibi kopyalanır (yeniden muxed) ve tekrar kodlamaya gerek kalmaz. Giriş sesi AAC değilse, AAC'ye yeniden kodlanır.

İşte ffprobeve kullanarak bunun nasıl yapılacağını gösteren basit bir komut dosyası ffmpeg. Dönüştürülecek videolarınızı içeren dizine kopyalayıp kaydedin, yürütme izni verin chmod +x yourscriptname, sonra çalıştırın ./yourscriptname.

#!/bin/bash

mkdir h264vids

for f in *.mkv
do
  audioformat=$(ffprobe -loglevel error -select_streams a:0 -show_entries stream=codec_name -of default=nw=1:nk=1 "$f")
  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 adlı bir dizine çıkacaktır h264vids.

  • Bu örnekte girdilerinizin olduğu varsayılmaktadır .mkv. Değilse .mkv, örnekteki örneği giriş dosyası türünüzle değiştirin veya açgözlülüğü yalnızca kullanın *.

  • İlgili yukarıdaki nota bakın -crfve -preset.

  • Kodlamayı ctrl+ ile duraklatabilir ve ile zdevam edebilirsiniz fg.


0

Önceki cevaplar göz önüne alındığında, aşağıdakilerle geldi:

for file in *265.mkv; do nice -n19 ffmpeg -i $file -c copy -c:v libx264 ${file/%265.mkv/264.mkv}; done

Bu, dosyaların her zaman biten bir adı olduğunu varsayar 265.mkv. Bu son ile değiştirilecektir 264.mkv.

Dosya adınız farklıysa, komutu buna göre uyarlamanız gerekir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.