วิธีการแปลง 1080 @ 50i -> 720 @ 50p โดยใช้ ffmpeg?


9

ฉันชอบวิดีโอ 50fps แต่ฉันไม่สามารถแปลง ffmpeg ให้เป็น 50fps สำหรับฉันได้

ความละเอียด 720p ใช้ได้กับฉันอย่างแน่นอนเพียงแค่ต้องการ FPS มากขึ้น

50i ดูราบรื่นกว่าในผู้เล่นที่เหมาะสม (ตัวอย่างเช่น GOM Player ตัดการเชื่อมต่อวิดีโอและเล่นที่ 50Hz ความแตกต่างใหญ่มากกับวิดีโอ 25Hz) ...

บรรทัดคำสั่งปัจจุบันของฉันคือ:

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

นี่คือรายละเอียดวิดีโอเพิ่มเติม วิดีโอต้นฉบับมาจากกล้องถ่ายวิดีโอ 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

คุณหมายถึงอะไร 'ทำไม่ได้' มันทำให้คุณมีข้อผิดพลาด?
เพียงแค่ Jake

มันสร้างไฟล์ซึ่งดูเหมือน 25p ไม่เป็น smoooth เช่น 50i ในผู้เล่นที่เหมาะสม
BarsMonster

@slhck นี่มันไป
BarsMonster

เหตุผลเฉพาะใด ๆ สำหรับการเข้ารหัสเป็น MPEG-4 Visual แทนที่จะใช้ h.264 อีกครั้ง (เช่น-vcodec libx264ไม่ว่ามันควรจะสำคัญมากที่ประมาณ 20 MBit / s แต่ยังคงอยู่
slhck

@slhck ก็เป็นเพียงค่าเริ่มต้น :-)
BarsMonster

คำตอบ:


1

"สำหรับกรณีที่ใช้งานได้จริงส่วนใหญ่เป็นไปไม่ได้ที่จะดึงวิดีโอโปรเกรสซีฟที่สมบูรณ์จากเนื้อหาแบบอินเทอร์เลซ"

นอกจากนี้หากคุณสามารถอัปโหลดตัวอย่างวิดีโอขนาดเล็กก็จะช่วยให้สาเหตุของคุณในทางที่ผิด

ที่มา: mplayerhq.hu/DOCS/HTML/en/menc-feat-telecine.html


7

เช่นเดียวกับการแทรกเนื้อหาแบบโปรเกรสซีฟแบ่งแต่ละเฟรมออกเป็น 2 ฟิลด์ดังนั้นจึงเพิ่มอัตราเฟรมเป็นสองเท่าวิธีการทั่วไปของการอินเทอร์เลซซิ่งคือการรวมแต่ละฟิลด์ 2 เป็น 1 เฟรมซึ่งจะลดอัตราลง 2 แน่นอนว่าคุณสามารถเพิ่มเฟรมเป็นสองเท่าในแต่ละเฟรมสุดท้าย แต่ก็ไม่ได้ให้ประโยชน์ใด ๆ

ก่อนอื่นเราสามารถอ่านไม่ให้ใช้ -deinterlace และ yadif แทน (ซึ่งคุณได้ทำไปแล้ว):

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

คุณอาจพบว่าส่วน yadifของเอกสาร FFMPEG น่าสนใจทีเดียว:

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. 

สังเกตว่าโหมดเริ่มต้นคือ 0 ซึ่งสั่งให้ FFMPEG ไปที่ ouput 1 เฟรมสำหรับแต่ละฟิลด์ 2 ดังนั้นจึงลดลงถึง fps ผมคิดว่าสิ่งที่คุณกำลังมองหาMODE 1: หนึ่งเฟรมต่อข้อมูล ฉันไม่แน่ใจเกินไปว่าจะใช้พารามิเตอร์ที่เป็นตัวเลือกเหล่านี้ได้อย่างไร แต่อาจเป็นเช่นนั้น

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

อย่างน้อยมันให้เอาต์พุต 50 fps แต่น่าเสียดายที่เฟรมต่อเนื่อง 2 เฟรมที่สร้างขึ้นคล้ายกันมาก ... ในขณะที่เมื่อฉันก้าวเฟรมวิดีโอดั้งเดิม 50i ไปทีละเฟรม
BarsMonster

@BarsMonster ก่อนอื่นฉันจะลองดูว่าผู้เล่น GOM ทำอะไรในกรณีที่เกิดจากการแก้ไขบางอย่าง ฉันอยากรู้อยากเห็น - มีเนื้อหาที่เชื่อมโยงกันมากที่มีข้อมูลสูง - เฟรมต่อวินาทีหรือไม่ (หลังจากทั้งหมดการแปลง 25p เป็น 50i สำหรับการออกอากาศไม่ได้สร้างข้อมูลการเคลื่อนไหวใหม่ใด ๆ - คุณต้องมีเนื้อหาแบบ Straigth-to-Interlaced) ถัดไปหากคุณพบว่ามีเทคนิค deinterlacting ที่ GOM ใช้ (ดูวิกิพีเดียมีค่อนข้างน้อย) คุณควรพยายามค้นหาตัวกรองที่สามารถใช้ใน AVISYNTH เป็นส่วนหนึ่งของกระบวนการแทนที่จะใช้วิธีการของ FFMPEG -YADIF .
mtone

1

อ้างอิงถึงเอกสารที่-rตัวเลือกชุดเฟรมไฟล์ที่ส่งออกต่อวินาที ตัวอย่างเช่นสิ่งนี้ตั้งค่าเอาต์พุตเป็น 50 เฟรมต่อวินาที:

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

น่าเสียดายที่ไฟล์ที่สร้างขึ้นมีความคล้ายคลึงกับ -r 25 และไม่เป็น smoooth อีกต่อไป ดูเหมือนว่าเพิ่งถ่ายวิดีโอ 25p ไปแล้วก็เพิ่มมันเป็นสองเท่า
BarsMonster

คุณได้ลองระบุการป้อนเฟรมเฟรมด้วยหรือไม่?
เพียงแค่ Jake

3
นั่นคือการขับออก เมื่อคุณตัดการเชื่อมต่อวิดีโอคุณจะเสียสละความเคลื่อนไหวเพื่อให้เข้ากันได้กับหน้าจอโปรเกรสซีฟ
เจสัน

@ Jason ดี videoplayer ของฉัน (ผู้เล่น GOM) ตัดการเชื่อมต่อวิดีโอ 50i และแสดงให้เห็นอย่างราบรื่น (เช่นที่ 50Hz) บนจอภาพ 120Hz TFT ของฉันซึ่งมีความก้าวหน้าอย่างเห็นได้ชัด เหตุใด Video Recoder จึงไม่ทำแบบเดียวกันและให้เอาต์พุต 50Hz ที่ราบรื่น ฉันเข้าใจว่า 50i มีรายละเอียดเล็ก ๆ น้อย ๆ แต่ทำไมฉันไม่สามารถคาดหวังได้ 50Hz
BarsMonster

มันขึ้นอยู่กับตัวกรอง deinterlacing ที่ใช้ เห็นได้ชัดว่าผู้เล่น GOM ทำงานได้ดีในเรื่องนี้ ไม่ทราบมากเกินไปเกี่ยวกับวิธีที่ FFmpeg จัดการกับวิดีโอแบบอินเตอร์เลซ @BarsMonster
slhck

1

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


1
น่าเสียดายที่มันยังคงสร้างเอาต์พุตเพียง 25 fps ... ไฟล์ต้นฉบับเป็นวิธีที่ราบรื่นยิ่งขึ้น .... แม้แต่การเพิ่ม -r 50 ก็ไม่ได้ช่วยอะไร
BarsMonster

0

คำสั่งนี้ใช้ได้สำหรับฉัน:

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

แหล่งที่มาคือไฟล์วิดีโอของ Sony

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.