¿Cómo crear una imagen en miniatura del video .flv usando ffmpeg?

1

Estoy usando el siguiente comando para crear una imagen en miniatura del video flv, la imagen se crea pero con error (la imagen no se abre)

ffmpeg -ss 00:00:10 -i output.mp4 -f image2  -s 150x150 -vframes 1  -c:v libx264  assetPathNew.jpg

ffmpeg version 0.9.2, Copyright (c) 2000-2012 the FFmpeg developers
  built on Oct 22 2012 11:15:53 with gcc 4.4.4 20100630 (Red Hat 4.4.4-10)
  configuration: --enable-libx264 --enable-gpl
  libavutil    51. 32. 0 / 51. 32. 0
  libavcodec   53. 42. 4 / 53. 42. 4
  libavformat  53. 24. 2 / 53. 24. 2
  libavdevice  53.  4. 0 / 53.  4. 0
  libavfilter   2. 53. 0 /  2. 53. 0
  libswscale    2.  1. 0 /  2.  1. 0
  libpostproc  51.  2. 0 / 51.  2. 0
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'output.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    creation_time   : 1970-01-01 00:00:00
    encoder         : Lavf52.64.2
  Duration: 00:00:16.96, start: 0.000000, bitrate: 873 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 320x240, 825 kb/s, 25 fps, 25 tbr, 25 tbn, 50 tbc
    Metadata:
      creation_time   : 1970-01-01 00:00:00
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: mp3 (mp4a / 0x6134706D), 22050 Hz, stereo, s16, 40 kb/s
    Metadata:
      creation_time   : 1970-01-01 00:00:00
      handler_name    : 
[buffer @ 0xa1c7620] w:320 h:240 pixfmt:yuv420p tb:1/1000000 sar:0/1 sws_param:
[scale @ 0xa1befa0] w:320 h:240 fmt:yuv420p -> w:150 h:150 fmt:yuv420p flags:0x4
[libx264 @ 0xa1bc540] using cpu capabilities: none!
[libx264 @ 0xa1bc540] profile High, level 1.1
Output #0, image2, to 'assetPathNew.jpg':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    creation_time   : 1970-01-01 00:00:00
    encoder         : Lavf53.24.2
    Stream #0:0(und): Video: h264, yuv420p, 150x150, q=-1--1, 90k tbn, 25 tbc
    Metadata:
      creation_time   : 1970-01-01 00:00:00
      handler_name    : VideoHandler
Stream mapping:
  Stream #0:0 -> #0:0 (h264 -> libx264)
Press [q] to stop, [?] for help
frame=    1 fps=  0 q=28.0 Lsize=       0kB time=00:00:00.-4 bitrate=  -0.0kbits/s dup=0 drop=41    
video:5kB audio:0kB global headers:0kB muxing overhead -100.000000%
[libx264 @ 0xa1bc540] frame I:1     Avg QP:32.24  size:  4707
[libx264 @ 0xa1bc540] mb I  I16..4:  0.0% 43.0% 57.0%
[libx264 @ 0xa1bc540] 8x8 transform intra:43.0%
[libx264 @ 0xa1bc540] coded y,uvDC,uvAC intra: 94.8% 97.0% 74.0%
[libx264 @ 0xa1bc540] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 35% 10%  9% 12%  8%  7%  3% 10%  5%
[libx264 @ 0xa1bc540] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 22% 17% 13% 10%  7%  8%  6% 10%  8%
[libx264 @ 0xa1bc540] i8c dc,h,v,p: 49% 19% 19% 13%
[libx264 @ 0xa1bc540] kb/s:941.40
Shishir Mudliyar
fuente

Respuestas:

4

Cuando pasa -c:v libx264después -i, le está diciendo a FFmpeg que codifique la transmisión de video de entrada a video x264. Sin embargo, le está diciendo que escriba el video en un image2formato, dentro de un archivo JPEG. Esto, naturalmente, no funcionará. De hecho, puede ver esto en la asignación de flujo:

Stream mapping:
Stream #0:0 -> #0:0 (h264 -> libx264)

Así que hagamos que FFmpeg escriba una imagen JPEG. Use un comando simple en su lugar:

ffmpeg -ss 00:00:10 -i output.mp4 -s 150x150 -vframes 1 assetPathNew.jpg

Esta vez, obtenemos la asignación de flujo correcta:

Stream mapping:
Stream #0:0 -> #0:0 (h264 -> mjpeg)

Tenga en cuenta que FFmpeg elegirá automáticamente el contenedor correcto. Por lo tanto, no necesita el -f image2.

El uso 150x150probablemente creará una imagen estirada y no mantendrá la relación de aspecto original de la entrada. Puede usar el scalefiltro para cambiar el tamaño automáticamente mientras mantiene la relación de aspecto:

ffmpeg -ss 00:00:10 -i output.mp4 -filter:v scale=150:-1 -vframes 1 assetPathNew.jpg

Esto probablemente le dará una salida de 150x113. Si debe tener un tamaño de 150x150, puede agregar el padfiltro para completar el extra:

ffmpeg -ss 00:00:10 -i output.mp4 -filter:v "scale=150:-1,pad=iw:150:0:(ow-ih)/2" -vframes 1 assetPathNew.jpg
slhck
fuente
Me ejecuto siguiendo el comando actualizado ffmpeg -ss 00:00:10 -i output.mp4 -filter: v "scale = 150: -1, pad = iw: 150: 0: (ow-ih) / 2" -vframes 1 assetPathNew.jpg y obtengo el siguiente error de asignación de secuencia: secuencia # 0: 0 -> # 0: 0 (h264 -> mjpeg) Presione [q] para detener, [?] para ayuda marco = 1 fps = 0 q = 4.0 Lsize = 0kB time = 00: 00: 00.04 bitrate = 0.0kbits / s dup = 0 drop = 41 video: 7kB audio: 0kB global headers: 0kB muxing gastos generales -100.000000%
Shishir Mudliyar
Eso no es un error, de verdad. Su mapeo de flujo es correcto y se emite un cuadro.
slhck
Obtuve esa imagen. Gracias una vez más para resolver el problema relacionado con ffmpeg.
Shishir Mudliyar