ฉันจะแปลงชุดรูปภาพ PNG เป็นวิดีโอสำหรับ YouTube ได้อย่างไร


13

ฉันมีลำดับ PNG ( นี่คือตัวอย่างหนึ่ง ) ซึ่งฉันเปลี่ยนเป็นวิดีโอที่มี ffmpeg:

ffmpeg -r 10 -i image%03d.png -s 1380x720 -c:v libx264 -qscale 10 -r 30
       basf_merck_libx264.mp4

ด้วย VLC มันดูดีและหรูหรา แต่ในyoutubeทั้งหมดที่ฉันเห็นคือสีเทา! ทำไม?

ป้อนคำอธิบายรูปภาพที่นี่

หลังจากผ่านไปสักครู่แถบแนวนอนที่มีจุดสีจะปรากฏขึ้น:

ป้อนคำอธิบายรูปภาพที่นี่

เมื่อฉันเพิ่ม '-pix_fmt yuv420p' ในคำสั่งจากนั้น youtube แสดงคลิปอย่างถูกต้อง แต่คุณภาพสูงสุดที่ฉันสามารถเลือกได้คือ 480p ซึ่งต่ำสำหรับจุดประสงค์นี้

เอาต์พุต ffmpeg

C:\Users\Raffael\Documents\proj>ffmpeg -r 10 -i image%03d.png -s 1380x720 -c:v libx264 -qscale 10 -r 30 basf_merck_libx264.mp4
ffmpeg version N-48785-g2ea3f37 Copyright (c) 2000-2013 the FFmpeg developers
  built on Jan 12 2013 20:45:33 with gcc 4.7.2 (GCC)
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnu
tls --enable-libass --enable-libbluray --enable-libcaca --enable-libfreetype --enable-libgsm --enable-libmp3lame --enable-libopencore-amrnb --enable-l
ibopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libtwol
ame --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxavs --enable-libxvid --enable-zlib
--enable-filter=frei0r
  libavutil      52. 14.100 / 52. 14.100
  libavcodec     54. 86.100 / 54. 86.100
  libavformat    54. 59.107 / 54. 59.107
  libavdevice    54.  3.102 / 54.  3.102
  libavfilter     3. 32.100 /  3. 32.100
  libswscale      2.  1.103 /  2.  1.103
  libswresample   0. 17.102 /  0. 17.102
  libpostproc    52.  2.100 / 52.  2.100
Input #0, image2, from 'image%03d.png':
  Duration: 00:00:02.04, start: 0.000000, bitrate: N/A
    Stream #0:0: Video: png, rgb24, 1380x720, 25 fps, 25 tbr, 25 tbn, 25 tbc
Please use -q:a or -q:v, -qscale is ambiguous
File 'basf_merck_libx264.mp4' already exists. Overwrite ? [y/N] y
using cpu capabilities: MMX2 SSE2Fast SSSE3 FastShuffle Cache64
[libx264 @ 00000000021c6fe0] profile High 4:4:4 Predictive, level 3.2, 4:4:4 8-bit
[libx264 @ 00000000021c6fe0] 264 - core 129 r2230 1cffe9f - H.264/MPEG-4 AVC codec - Copyleft 2003-2012 - http://www.videolan.org/x264.html - options:
 cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 dead
zone=21,11 fast_pskip=1 chroma_qp_offset=4 threads=3 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_int
ra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahea
d=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
Output #0, mp4, to 'basf_merck_libx264.mp4':
  Metadata:
    encoder         : Lavf54.59.107
    Stream #0:0: Video: h264 ([33][0][0][0] / 0x0021), yuv444p, 1380x720, q=-1--1, 15360 tbn, 30 tbc
Stream mapping:
  Stream #0:0 -> #0:0 (png -> libx264)
Press [q] to stop, [?] for help
frame=  151 fps= 16 q=-1.0 Lsize=    1995kB time=00:00:04.96 bitrate=3290.5kbits/s dup=100 drop=0
video:1992kB audio:0kB subtitle:0 global headers:0kB muxing overhead 0.127092%
[libx264 @ 00000000021c6fe0] frame I:1     Avg QP:22.19  size: 57949
[libx264 @ 00000000021c6fe0] frame P:54    Avg QP:26.90  size: 36277
[libx264 @ 00000000021c6fe0] frame B:96    Avg QP:21.56  size:   236
[libx264 @ 00000000021c6fe0] consecutive B-frames:  5.3%  1.3% 85.4%  7.9%
[libx264 @ 00000000021c6fe0] mb I  I16..4: 71.1%  2.5% 26.4%
[libx264 @ 00000000021c6fe0] mb P  I16..4:  0.6%  0.5%  5.7%  P16..4:  3.1%  2.1%  2.9%  0.0%  0.0%    skip:85.0%
[libx264 @ 00000000021c6fe0] mb B  I16..4:  0.2%  0.1%  0.0%  B16..8:  4.7%  0.1%  0.0%  direct: 0.0%  skip:94.9%  L0:77.6% L1:22.3% BI: 0.1%
[libx264 @ 00000000021c6fe0] 8x8 transform intra:7.7% inter:5.2%
[libx264 @ 00000000021c6fe0] coded y,u,v intra: 59.5% 54.3% 52.9% inter: 1.3% 1.0% 0.6%
[libx264 @ 00000000021c6fe0] i16 v,h,dc,p: 81% 15%  4%  0%
[libx264 @ 00000000021c6fe0] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 10%  5% 64%  3%  2%  4%  3%  4%  3%
[libx264 @ 00000000021c6fe0] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 27% 13% 21%  7%  6%  7%  6%  7%  6%
[libx264 @ 00000000021c6fe0] Weighted P-Frames: Y:0.0% UV:0.0%
[libx264 @ 00000000021c6fe0] ref P L0: 65.3%  9.0% 20.2%  5.5%
[libx264 @ 00000000021c6fe0] ref B L0: 73.0% 21.7%  5.3%
[libx264 @ 00000000021c6fe0] ref B L1: 90.8%  9.2%
[libx264 @ 00000000021c6fe0] kb/s:3241.64

ฉันรวบรวมข้อมูลบนเว็บไซต์ของฉัน: http://www.joyofdata.de/blog/hd-clips-with-ffmpeg-for-youtube-and-vimeo/


โปรดระบุเอาต์พุตคอนโซลแบบเต็มที่ไม่ได้เจียระไนสำหรับคำสั่ง FFmpeg รูปแบบพิกเซลไม่เกี่ยวข้องกับขนาดดังนั้นคุณควรเลือกความละเอียดมากกว่า 480p บน YouTube ได้เสมอหากแหล่งที่มาของคุณคือ 720p และสูงกว่า
slhck

เพิ่มเอาต์พุตของคำสั่ง ffmpeg คลิปที่ดูด้วย VLC ยังคงแสดงความละเอียดที่ใหญ่กว่าเดิม แต่ youtube ให้ฉันแค่ 480p
Raffael

คำตอบ:


34

YouTube คาดว่าวิดีโอของคุณจะถูกเข้ารหัสด้วยH.264 หากคุณใช้libx264ให้ทำตามคำแนะนำการเข้ารหัสของ YouTube:

ffmpeg -framerate 10 -i image%03d.png -s:v 1280x720 -c:v libx264 \
-profile:v high -crf 20 -pix_fmt yuv420p daimler_man.mp4

เคล็ดลับ:

  • -qscaleเป็นวิธีการตั้งค่าคุณภาพ แต่-qscaleเพียงอย่างเดียวไม่ชัดเจน ใช้-qscale:vสำหรับวิดีโอและ-qscale:aตัวเข้ารหัสเสียงที่รองรับ อย่าใช้ตัวเลือกนี้เว้นแต่คุณจะรู้ว่ามันหมายถึงอะไร

    x264 -crfมีตัวเลือกที่ดีกว่าสำหรับการตั้งค่าคุณภาพ: คงที่อัตราปัจจัยเป็นโหมดการเข้ารหัสที่มีคุณภาพอย่างต่อเนื่อง ค่าที่ต่ำกว่าหมายถึงคุณภาพที่ดีขึ้น แต่สิ่งที่ต่ำกว่า 18 อาจไม่ดีกว่าการมองเห็น ค่าเริ่มต้นคือ 23 แต่อย่าง 20 จะดีกว่าเนื่องจาก YouTube เข้ารหัสวิดีโอของคุณอีกครั้ง

  • -pix_fmt yuv420pควรใช้เพื่อเปิดใช้งานการสุ่มตัวอย่างแบบ 4: 2: 0 สำหรับอินพุต PNG ซึ่งมักจะไม่ถูกสุ่มตัวอย่างเลย (4: 4: 4 ตามที่สังเกตในเอาต์พุตของคุณ) และมักจะมีช่องอัลฟ่า YouTube จะจัดการสิ่งนี้ไม่ถูกต้อง

  • -rไม่จำเป็นสำหรับการตั้งค่าอัตราเฟรมเอาต์พุตเนื่องจาก YouTube จะจัดการอัตราเฟรมเกือบทั้งหมดอยู่แล้ว เมื่ออ่าน 10 ภาพต่อวินาทีเป็นอินพุทการเปลี่ยนอัตราเฟรมเอาท์พุทเป็นอะไรที่สูงกว่า (เช่น 30) จะเป็นการทำซ้ำเฟรมเท่านั้นซึ่งไม่จำเป็น

  • -s:v 1380x720มีความละเอียดแปลก ๆ คิดเกี่ยวกับการใช้ความละเอียดเนทีฟ 16: 9 720p 1280 × 720 และสร้างแผนการของคุณใหม่หากจำเป็น วิธีนี้จะช่วยให้คุณมีปัญหาและปัญหาเกี่ยวกับการเขียนจดหมายใน YouTube และการยึดติดกับมิติที่ผิดปกติอาจทำให้วิดีโอของคุณไม่แสดงผลเต็มความละเอียดหรือนำเสนอที่การตั้งค่าคุณภาพ 720p

  • ใช้คอนเทนเนอร์ MP4 แทน MOV ซึ่ง YouTube แนะนำให้คุณใช้ MP4 นั้นเหมือนกันกับฟังก์ชันการทำงานของ MOV แต่มีการรองรับอุปกรณ์การเล่นที่ดีกว่า โดยทั่วไปแล้วชอบมากกว่า MOV เมื่อคุณทำได้


ฉันไม่คิดว่าความคิดเห็นเกี่ยวกับ-qscaleความสมเหตุสมผล สำหรับlibx264มันเหมือนกับการตั้งค่า-qpใช่ไหม เป็นตัวเลือกที่ใช้กับการบีบอัด x264 ดังนั้นแหล่งที่มาของ PNG จึงไม่เกี่ยวข้อง ไม่ว่า-crfจะเป็นตัวเลือกที่ดีกว่า-qpหรือ-b:vสำหรับการส่งแบบครั้งเดียวด้วยคุณภาพเป้าหมาย (แทนที่จะเป็นบิตเรตเป้าหมาย)
Peter Cordes

1
คุณควรแก้ไขเอฟเฟกต์เฟรมซ้ำด้วย -framerate 10 -i input -r 30จะสร้างรายการซ้ำเมื่อส่งออกเป็น mp4 (ไม่ใช่ mkv สำหรับเหตุผลที่เกี่ยวข้องกับ ffmpeg ที่สนับสนุน vfr ใน mkv ฉันคิดว่า) หากเนื้อหาของคุณคือ 10 fps ให้สร้างวิดีโอเอาต์พุต 10 fps ฉันคิดว่า youtube สนับสนุนสิ่งที่เป็น framerate ที่คุณต้องการ (มากถึง 60) กล้องโทรศัพท์มือถือบันทึกวิดีโอ h.264 อัตราเฟรมตัวแปรใน mp4 (โดยเฉพาะในที่แสงน้อย) ดังนั้นหากคุณสามารถอัปโหลดวิดีโอเหล่านั้นไปยัง YouTube ได้โดยตรงคุณจะไม่เป็นไร
Peter Cordes

@PeterCordes อย่างแน่นอน ฉันได้-r 30รับคำสั่งจาก OP โดยไม่เปลี่ยนมัน
slhck

ด้วยคำสั่งที่อ้างอิงคำตอบนี้ ( ffmpeg -y -framerate 1 -i static_image.png -i bg_music.mp3 -s:v 1280x720 -c:v libx264 -profile:v high -crf 20 -pix_fmt yuv420p output.mp4) โชคไม่ดีที่ฉันยังคงได้รับข้อผิดพลาด "วิดีโอล้มเหลวในการประมวลผล" ไม่แน่ใจว่าจะแก้ไขข้อบกพร่องได้อย่างไร
Radon Rosborough
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.