¿Cómo puedo convertir una serie de imágenes PNG en un video para YouTube?

13

Tengo una secuencia de PNG ( aquí hay una muestra ) que convierto en un video con ffmpeg:

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

¿Con VLC todo se ve bien y elegante pero en youtube todo lo que veo es gris? ¿por qué?

ingrese la descripción de la imagen aquí

Después de un rato se muestra una barra horizontal con manchas coloridas:

ingrese la descripción de la imagen aquí

Cuando agrego '-pix_fmt yuv420p' al comando, youtube muestra el clip correctamente. Pero la mejor calidad que puedo elegir es 480p, que es demasiado baja para este propósito.

salida 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

Recopilé la información en mi sitio web: http://www.joyofdata.de/blog/hd-clips-with-ffmpeg-for-youtube-and-vimeo/

Raffael
fuente
Proporcione la salida de consola completa y sin cortes para los comandos de FFmpeg. Los formatos de píxeles no están relacionados con las dimensiones, por lo que siempre debe poder seleccionar más de 480p de resolución en YouTube si su fuente es 720p y superior.
slhck
agregó la salida del comando ffmpeg. El clip visto con VLC todavía muestra la vieja resolución más grande. Pero youtube me ofrece solo 480p.
Raffael

Respuestas:

34

YouTube espera que tu video tenga codificación H.264 . Si lo usa libx264, siga las sugerencias de codificación de 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

Consejos:

  • -qscalees una forma de establecer calidad, pero -qscalesolo es ambiguo. Úselo -qscale:vpara -qscale:acodificadores de video y audio que lo admitan. No use esta opción a menos que sepa lo que significa.

    x264 tiene una mejor opción para la calidad del entorno: -crf. El Factor de velocidad constante es un modo de codificación de calidad constante. Los valores más bajos significan una mejor calidad, pero cualquier cosa por debajo de 18 podría no ser visualmente mejor. El valor predeterminado es 23, pero algo así como 20 sería mejor ya que YouTube vuelve a codificar su video.

  • -pix_fmt yuv420pdebe usarse para habilitar el muestreo descendente 4: 2: 0 para la entrada PNG, que generalmente no está muestreado en absoluto (4: 4: 4, como se observa en su salida) y a menudo contiene un canal Alfa. YouTube no manejará esto correctamente.

  • -rno es necesario para configurar la velocidad de fotogramas de salida, ya que YouTube manejará casi todas las velocidades de fotogramas de todos modos. Al leer 10 imágenes por segundo como entrada, cambiar la velocidad de fotogramas de salida a algo más alto (por ejemplo, 30) solo duplicará fotogramas, lo cual no es necesario.

  • -s:v 1380x720Es una resolución extraña. Piense en usar la resolución nativa 16: 9 720p 1280 × 720 y volver a generar sus trazados si es necesario. Esto le ahorrará algunos problemas y problemas de buzón en YouTube, y atenerse a dimensiones inusuales podría evitar que su video se muestre en resolución completa o se ofrezca en la configuración de calidad 720p.

  • Use el contenedor MP4 en lugar de MOV, que YouTube sugiere que use. MP4 es prácticamente idéntico en funcionalidad a MOV, pero tiene mejor soporte en dispositivos de reproducción. En general, prefiera eso sobre MOV cuando pueda.

slhck
fuente
No creo que los comentarios -qscaletengan sentido. Porque libx264es lo mismo que configurar -qp, ¿no? Es una opción que se aplica a la compresión x264, por lo que la fuente PNG es irrelevante. En cualquier caso, -crfes una mejor opción que -qpo -b:vpara un solo pase con una calidad objetivo. (en lugar de una tasa de bits objetivo).
Peter Cordes
1
También debe corregir el efecto de fotogramas duplicados. -framerate 10 -i input -r 30generará duplicados cuando salga a mp4. (no para mkv, por razones relacionadas con ffmpeg que admite vfr en mkv, creo). Si su contenido es de 10 fps, simplemente haga un video de salida de 10 fps. Creo que youtube admite cualquier framerate que desee (hasta 60). Las cámaras de los teléfonos celulares graban video h.264 de velocidad de cuadro variable en mp4 (especialmente con poca luz), por lo que si puede cargarlas directamente a YouTube, estará bien.
Peter Cordes
@PeterCordes Absolutamente. Había tomado el -r 30comando del OP sin cambiarlo.
slhck
Con un comando basado en el de esta respuesta ( 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), desafortunadamente todavía recibo el misterioso error "el video no pudo procesar". No estoy seguro de cómo depurarlo, desafortunadamente.
Radon Rosborough