Bagaimana cara mengubah 1080 @ 50i -> 720 @ 50p menggunakan ffmpeg?


9

Saya sangat suka video 50fps, tetapi saya tidak dapat membuat ffmpeg mengubahnya menjadi 50fps untuk saya.

Resolusi 720p baik-baik saja dengan saya, hanya perlu lebih banyak FPS.

50i hanya terlihat jauh lebih halus di pemain yang tepat (misalnya GOM Player deinterlaces video dan memainkannya pada 50Hz. Perbedaan yang sangat besar untuk video 25Hz.) ...

Baris perintah saya saat ini adalah:

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

Berikut ini detail video lainnya. Sumber video adalah dari camcoder Cannon HF10 AVCHD.

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

Apa maksudmu, 'tidak bisa membuat'? Apakah itu memberi Anda kesalahan?
Just Jake

Ini menghasilkan file, yang terlihat seperti 25p, tidak smoooth 50i di pemain yang tepat.
BarsMonster

@slhck Ini dia
BarsMonster

Ada alasan khusus untuk melakukan enkode ke MPEG-4 Visual alih-alih menggunakan h.264 lagi (mis. -vcodec libx264? Bukan berarti itu akan menjadi masalah sebesar ~ 20 MBit / dt, tapi tetap saja.
slhck

@lhck baiklah, ini hanya default :-)
BarsMonster

Jawaban:



7

Sama seperti interlacing konten progresif membagi setiap frame menjadi 2 bidang, sehingga menggandakan laju bingkai, metode umum deinterlacing adalah menggabungkan masing-masing 2 bidang menjadi 1 bingkai, yang mengurangi laju dengan 2, sehingga mengambil 50 menjadi 25fps. Anda tentu saja dapat menggandakan setiap kerangka akhir, tetapi itu tidak memberikan manfaat apa pun.

Pertama, kita dapat membaca untuk tidak menggunakan -deinterlace, dan sebagai gantinya (yang sudah Anda lakukan):

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

Anda mungkin akan menemukan bagian yadif dari dokumentasi FFMPEG cukup menarik:

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. 

Perhatikan bagaimana MODE default adalah 0, yang menginstruksikan FFMPEG untuk mengeluarkan 1 frame untuk masing-masing 2 bidang, sehingga mengurangi separuh fps. Saya pikir yang Anda cari adalah MODE 1: satu frame per bidang . Saya tidak terlalu yakin bagaimana cara menggunakan parameter opsional ini tetapi mungkin sesuatu seperti

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

Setidaknya itu memberikan output 50 fps, tapi sayangnya 2 frame berurutan yang dihasilkan sangat mirip ... Sementara ketika saya melangkah bingkai video 50i asli dengan bingkai saya benar-benar melihat bahwa gerakan cepat memiliki 'langkah' dua kali lebih banyak, dan lebih halus.
BarsMonster

@BarsMonster Pertama, saya akan mencoba mencari tahu apa yang dilakukan pemain GOM, kalau-kalau itu karena beberapa bentuk interpolasi. Saya ingin tahu - adakah konten interlaced yang mengandung informasi fps tinggi? (Bagaimanapun, mengonversi 25p ke 50i untuk siaran tidak membuat informasi gerak baru - Anda memerlukan konten straigth-to-interlaced). Selanjutnya, jika Anda menemukan teknik deinterlacting yang digunakan GOM (lihat wikipedia, ada beberapa), Anda harus mencoba menemukan filter untuk itu yang dapat digunakan dalam AVISYNTH sebagai bagian dari proses alih-alih menggunakan metode-YADIF FFMPEG .
mtone

1

Menurut dokumentasi , -ropsi mengatur frame file output per detik. Misalnya, ini menetapkan output ke 50 frame per detik:

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

Sayangnya, file yang dihasilkan hampir sama dengan untuk -r 25. Dan itu tidak lagi smoooth. Sepertinya itu hanya mengambil video 25p, dan kemudian membingkainya.
BarsMonster

Sudahkah Anda mencoba menentukan framerate input juga?
Just Jake

3
Itu excpeted. Ketika Anda men-deinterlace video, Anda mengorbankan gerakan halus agar sesuai dengan tampilan progresif.
Jason

@Jason Nah, videoplayer (GOM Player) saya deinterlaces video 50i, dan menunjukkannya dengan lancar (yaitu pada 50Hz) pada monitor TFT 120Hz saya, yang jelas progresif. Mengapa video recoder tidak dapat melakukan hal yang sama, dan menghasilkan output 50Hz yang lancar? Saya mengerti bahwa 50i memiliki detail yang lebih kecil, tetapi mengapa saya tidak bisa berharap untuk mendapatkan output 50Hz?
BarsMonster

Itu tergantung pada filter deinterlacing yang digunakan. Jelas GOM Player melakukan pekerjaan dengan baik. Tidak tahu terlalu banyak tentang bagaimana FFmpeg menangani video interlaced. @BarsMonster
slhck

1

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


1
Sayangnya, masih menghasilkan output hanya 25 fps ... File asli dengan cara yang lebih lancar .... Bahkan menambahkan -r 50 tidak membantu.
BarsMonster

0

Perintah ini bekerja untuk saya:

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

Sumbernya adalah file camcorder Sony.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.