Video dosyasını yeniden kodlamadan doğru en boy oranı


18

Aşağıdaki özelliklere sahip bir video akışı var:

Stream #0:0: Video: mpeg4 (Advanced Simple Profile) (XVID / 0x44495658), yuv420p, 720x416 [SAR 1:1 DAR 45:26], 1908 kb/s, 25 fps, 25 tbr, 25 tbn, 25 tbc

VLC'de çalıştırdığımda, videonun doğru en boy oranıyla gösterilmesi için en boy oranını "4: 3" olarak değiştirmek için "A" ya basmam gerekiyor.

Video gerçeklerine bakıldığında, a) gerçek videonun piksel verilerinde yanlış uzatılmış olması veya b) yalnızca yanlış ayarlanmış bir meta veri değeri var mı?

Birincisi, videoyu yeniden kodlayabileceğimi ve genişlik ve yüksekliği değiştirebileceğimi biliyorum. Ama ikincisi, videonun kendisini yeniden kodlamadan meta verileri düzeltmek için hangi ffmpeg komutunu çalıştırırım?

Yanıtlar:


36

Örnek En Boy Oranı (SAR) ile Ekran En Boy Oranı (DAR) arasında bir fark vardır. Videoyu 4: 3'te gösterilecek şekilde değiştirmek isterseniz, görüntüdeki gerçek pikselleri değiştirmeniz (pikselleri ölçeklendirerek ve SAR'ı değiştirerek) veya kap düzeyinde harici olarak bildiren bir meta veri bayrağı ayarlamanız gerekir. görüntüyü istediğiniz DAR'a genişletmek için medya oynatıcıları.

Video filtresi uygulamadan pikselleri ölçeklendiremez ve SAR değerini değiştiremezsiniz. Bu yöntemi seçerseniz, dosyayı dönüştürmeniz gerekir; çünkü video filtresi uygularken video akışını "akış olarak kopyalayamazsınız".

Görüntüyü ölçeklemek ve SAR'ı değiştirmek için (kod dönüştürme sırasında) şunları deneyin:

ffmpeg -i <INPUT_FILE> -vf scale=720:540 -c:v <Video_Codec> <OUTPUT_FILE>

Öte yandan, sadece meta veri bayrağını değiştirmek ve DAR'ı ayarlamak istiyorsanız, videoyu akış olarak kopyalayabilirsiniz. Bunu yapmak için şunu deneyin:

ffmpeg -i <INPUT_FILE> -aspect 720:540 -c copy [OUTPUT_FILE]

Mükemmel! Yönü değiştirmek hemen işe yaradı!
forthrin

2
-c copyAynı anda kullanamaz ve ölçeklendiremezsiniz; ancak -aspecten boy oranını kap düzeyinde (ancak akış düzeyinde değil) değiştirmek için kullanabilirsiniz .
llogan

@LordNeckbeard, kullanarak WMP veya MPC- HC'de -aspectoynatmak için çalışır ffplay, ancak çalışmaz. Stream #…Bilgi satırına ek bir SAR / DAR öğesi ekler , FFmpeg/probe/playancak genel oynatma için bir çözüm gibi görünmemektedir. Videoyu pencereyle uzatmak, MPC-HC oynatımı için en kolay çözüm gibi görünüyor.
Lumi

MPEG2 için reencoding olmadan benim için çalışmadı
Mikhail V

Benim için neden işe yaramadığını bilmiyorum. Aynı videoyu çıktı!
Tina J

4

Delgado'nın cevabı MP4Box'ın bunu yapabileceği doğru, ancak -parseçenek açıklandığı gibi çalışmıyor. Bir -outparametreyle (orijinal dosyanızı rahatsız etmemek için):

mp4box source.mp4 -out target.mp4 -par stream-number=width:height

Kullandığınızda -par stream-number=width:height, piksel en boy oranını, yani aygıt en boy oranını depolama en boy oranına bölmenin sonucunu tanımlarsınız. (Aynı şekilde, bir kaynak pikselin en boy oranını açıklıyorsunuz.) Örneğin, 720 × 480 olan bir DVD kaynağınız olduğunu ve doğru ekran en boy oranının 4: 3 olduğunu varsayalım. Bu durumda, ihtiyacınız var:

mp4box source.mp4 -out target.mp4 -par 1=8:9

çünkü (4/3) / (720/480) = 8/9.

Kaynak gerçek SD NTSC piksellerini temsil ediyorsa (bu durumda yalnızca merkezi 704 × 480 piksellerin 4 × 3 ekranla eşleşmesi gerekir, her iki tarafta 8 piksel fazla taranabilir), doğru komut şu olacaktır:

mp4box source.mp4 -out target.mp4 -par 1=10:11

çünkü (4/3) / (704/480) = 10/11 - standart çözünürlüklü NTSC video için tam olarak referans piksel en boy oranı.

Soruda verilen durum için, gerçekten 4: 3 ise, çok garip bir piksel en boy oranı verir: (4/3) / (720/416) = 104/135. Bir DVD kaynağı öneren 720 genişliğindedir; 25 fps'lik bir video, PAL'ı gösteriyor, ancak PAR 1'den az çalışıyor ve NTSC'yi gösteriyor. 4: 5 olabilir, (104: 135'e çok yakın), ama bu piksel en boy oranını üreten hiçbir şey bilmiyorum; belki önce deneyin ve sonra hala yatay olarak biraz fazla gerilmiş görünüyorsa 3: 4 deneyin. Bunun tam olarak 4: 3 olduğundan eminseniz, sadece 104: 135 kullanın.


3

ffmpeg bir video akışının parametrelerini yeniden kodlamadan değiştiremez, MP4Box (gpac'ın bir parçası ) ve mkvmerge can. Bir video akışı ve 4: 3 gerçek / doğru en boy oranı olması durumunda şunları denemek isteyebilirsiniz:

MP4Box -par 1=3:4 VideoFile.mp4

    "-par" : PixelAspectRatio (adjusts DAR + SAR with respect to the video resolution)
    "1"=   : stream number
    "3:4"  : aspect ratio (lower number 1st!)
    Changes are directly applied to "VideoFile.mp4", no copy

Önce ve sonra doğrulamak için: ffmpeg -i VideoFile.mp4


0

Değişen SAR ile de çalışmalarını reencoding olmadan ffmpegüzerinde .mp4kullanarak h264_metadataGyan olarak işaret buraya :

ffmpeg -i in.mp4 -c copy -bsf:v "h264_metadata=sample_aspect_ratio=4/3" out.mp4

Bu teorik olarak soruyu cevaplayabilirken, cevabın temel kısımlarını buraya dahil etmek ve referans için bağlantı sağlamak tercih edilir.
MMM
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.