Nasıl ffmpeg kullanarak 1080 @ 50i -> 720 @ 50p dönüştürmek için?


9

Ben 50fps video gerçekten seviyorum, ama ffmpeg benim için 50fps dönüştürmek yapamam.

720p çözünürlük benimle kesinlikle iyi, sadece daha fazla FPS'ye ihtiyacım var.

50i, uygun oynatıcılarda çok daha yumuşak görünüyor (örneğin, GOM Player videoyu deforme eder ve 50Hz'de oynatır. 25Hz video ile çok büyük fark.) ...

Geçerli komut satırım:

ffmpeg -i 00010.MTS -threads 3 -filter:v yadif -s "1280x720" -r 50 -b:v 20M output.avi

İşte daha fazla video detayı. Kaynak video Cannon HF10 AVCHD camcoder'dan.

ffmpeg -i 00010.MTS -threads 3 -filter:v yadif -s "1280x720" -r 50 -b:v 20M output.avi
ffmpeg version N-37541-g670229e Copyright (c) 2000-2012 the FFmpeg developers
  built on Feb  3 2012 20:14:17 with gcc 4.6.2
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-ru
ntime-cpudetect --enable-avisynth --enable-bzlib --enable-frei0r --enable-libope
ncore-amrnb --enable-libopencore-amrwb --enable-libfreetype --enable-libgsm --en
able-libmp3lame --enable-libopenjpeg --enable-librtmp --enable-libschroedinger -
-enable-libspeex --enable-libtheora --enable-libvo-aacenc --enable-libvo-amrwben
c --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxavs --enable-
libxvid --enable-zlib
  libavutil      51. 37.100 / 51. 37.100
  libavcodec     54.  0.102 / 54.  0.102
  libavformat    54.  0.100 / 54.  0.100
  libavdevice    53.  4.100 / 53.  4.100
  libavfilter     2. 61.100 /  2. 61.100
  libswscale      2.  1.100 /  2.  1.100
  libswresample   0.  6.100 /  0.  6.100
  libpostproc    52.  0.100 / 52.  0.100
[h264 @ 000000000033FA30] Increasing reorder buffer to 1
Input #0, mpegts, from '00010.MTS':
  Duration: 00:03:13.92, start: 0.482156, bitrate: 16304 kb/s
  Program 1
    Stream #0:0[0x1011]: Video: h264 (High) (HDMV / 0x564D4448), yuv420p, 1920x1
080 [SAR 1:1 DAR 16:9], 50 fps, 50 tbr, 90k tbn, 50 tbc
    Stream #0:1[0x1100]: Audio: ac3 (AC-3 / 0x332D4341), 48000 Hz, stereo, s16,
256 kb/s
File 'output.avi' already exists. Overwrite ? [y/N] y
w:1920 h:1080 pixfmt:yuv420p tb:1/1000000 sar:1/1 sws_param:
[yadif @ 0000000003CE95B0] mode:0 parity:-1 auto_enable:0
[scale @ 0000000003CE9550] w:1920 h:1080 fmt:yuv420p -> w:1280 h:720 fmt:yuv420p
 flags:0x4
Output #0, avi, to 'output.avi':
  Metadata:
    ISFT            : Lavf54.0.100
    Stream #0:0: Video: mpeg4 (FMP4 / 0x34504D46), yuv420p, 1280x720 [SAR 1:1 DA
R 16:9], q=2-31, 20000 kb/s, 50 tbn, 50 tbc
    Stream #0:1: Audio: mp3 (U[0][0][0] / 0x0055), 48000 Hz, stereo, s16, 128 kb
/s
Stream mapping:
  Stream #0:0 -> #0:0 (h264 -> mpeg4)
  Stream #0:1 -> #0:1 (ac3 -> libmp3lame)
Press [q] to stop, [?] for help
frame=   15 fps=  0 q=2.0 size=     945kB time=00:00:00.62 bitrate=12481.3kbits/
frame=   32 fps= 32 q=2.0 size=    2132kB time=00:00:01.30 bitrate=13435.2kbits/
frame=   51 fps= 34 q=2.0 size=    3372kB time=00:00:02.06 bitrate=13409.2kbits/
frame=   70 fps= 35 q=2.0 size=    4641kB time=00:00:02.82 bitrate=13482.8kbits/
frame=   76 fps= 35 q=2.0 Lsize=    5047kB time=00:00:03.06 bitrate=13511.9kbits

Ne demek, 'yapamaz'? Size hata veriyor mu?
Sadece Jake

Uygun oynatıcıda 50i kadar pürüzsüz olmayan 25p gibi görünen bir dosya üretir.
BarsMonster

@slhck İşte gidiyor
BarsMonster

Tekrar h.264 kullanmak yerine MPEG-4 Visual'a kodlamanın özel bir nedeni (örn -vcodec libx264. ~ 20 MBit / s'de çok fazla önemli değil, ama yine de.
slhck

@slhck iyi, sadece varsayılan :-)
BarsMonster

Yanıtlar:



7

Aşamalı içeriğin birbirine geçmesi gibi, her kareyi 2 alana böler, böylece kare hızını iki katına çıkarır, ortak deinterlacing yöntemi her 2 alanı 1 karede birleştirerek hızı 2 azaltarak 50 fps'ye 25 fps alır. Elbette her bir son kareyi iki katına çıkarabilirsiniz, ancak bu herhangi bir fayda sağlamaz.

İlk olarak, -deinterlace ve yadif kullanmamayı okuyabiliriz (zaten yaptığınız):

 - deinterlace This option is deprecated since the deinterlacing is very low quality. Use the yadif filter with -filter:v yadif. 

Muhtemelen FFMPEG belgelerinin yadif bölümünü oldukça ilginç bulacaksınız :

Deinterlace the input video ("yadif" means "yet another deinterlacing filter"). 
It accepts the optional parameters: mode:parity:auto. 

MODE specifies the interlacing mode to adopt, accepts one of the following values: 
‘0’
output 1 frame for each frame
‘1’
output 1 frame for each field 
‘2’
like 0 but skips spatial interlacing check 
‘3’
like 1 but skips spatial interlacing check 
Default value is 0. 

PARITY default value is -1.
AUTO default value is 0. 

FFMPEG'e her 2 alan için 1 kare çıkmasını ve böylece fps'yi yarıya indirmesini bildiren varsayılan MOD'un 0 olduğuna dikkat edin. Bence aradığınız şey MODE 1: alan başına bir kare . Bu isteğe bağlı parametreleri nasıl kullanacağımdan çok emin değilim ama belki

-filter:v yadif 1:-1:0 -s "1280x720" -r 50 

En azından 50 fps çıkış veriyor, ancak maalesef üretilen 2 ardışık kare çok benzer ... Orijinal 50i video karesini kare kare adım attığımda, hızlı hareketin iki kat daha fazla 'adım' ve daha pürüzsüz olduğunu görüyorum.
BarsMonster

@BarsMonster İlk olarak, bir çeşit enterpolasyon nedeniyle GOM oyuncusunun ne yaptığını bulmaya çalışacağım. Merak ediyorum - yüksek fps bilgileri içeren o kadar çok geçmeli içerik var mı? (Sonuçta, yayın için 25p'yi 50i'ye dönüştürmek herhangi bir yeni hareket bilgisi oluşturmaz - uzunluktan geçmeli içeriğe ihtiyacınız vardır). Daha sonra, GOM'un kullandığı bir deinterlacting tekniği bulursanız (bkz. Wikipedia, oldukça az var), bunun için FISFEGEG'in -YADIF yöntemini kullanmak yerine işlemin bir parçası olarak AVISYNTH'de kullanılabilecek bir filtre bulmaya çalışmalısınız. .
mtone

1

Belgelere göre , -rseçenek saniyede çıktı dosyası karelerini ayarlar. Örneğin, bu, çıktıyı saniyede 50 kareye ayarlar:

ffmpeg -i input.avi -r 50 output.avi

Ne yazık ki, üretilen dosya -r 25 ile aynıdır. Ve artık pürüzsüz değil. Görünüşe göre sadece 25p video çekti ve sonra çerçeveledi.
BarsMonster

Giriş kare hızını da belirlemeyi denediniz mi?
Sadece Jake

3
Bu çok heyecanlı. Videoyu ayrıştırdığınızda, aşamalı ekranlarla uyumluluk için yumuşak hareketten ödün verirsiniz.
Jason

@Jason Eh, video oynatıcım (GOM Player) 50i videoyu deinterlace ve açıkça ilerici olan 120Hz TFT monitörde sorunsuz (yani 50Hz) gösterir. Video kaydedici aynı şeyi yapamıyor ve pürüzsüz 50Hz çıkış üretemiyor? 50i'nin daha az detayı olduğunu anlıyorum, ama neden 50Hz çıkış almayı bekleyemiyorum?
BarsMonster

Kullanılan deinterlacing filtreye bağlıdır. Açıkçası GOM Player bu konuda iyi bir iş çıkarıyor. FFmpeg'in titreşimli videoyu nasıl ele aldığı hakkında çok fazla şey bilmiyorum. @BarsMonster
slhck

1

ffmpeg -i input.avi -deinterlace -filter:v yadif -s "1280x720" output.avi


1
Ne yazık ki, hala sadece 25 fps çıktı üretti ... Orijinal dosya yol daha pürüzsüz .... -r 50 eklemek bile yardımcı olmadı.
BarsMonster

0

Bu komut benim için çalışıyor:

ffmpeg -i source_50i.MTS -aspect 1920:1080 -vf yadif=1,scale=1920:1080 -c:v libx264 -preset fast -profile:v high -crf 23 -ac 2 -strict experimental -c:a aac -b:a 96k -movflags +faststart -y result_50p.mp4

Kaynak bir Sony video kamera dosyasıydı.

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.