Los archivos Conmp 2 .mp4 creados con ffmpeg no funcionan correctamente


1

Estoy tratando de concatenar 2 archivos mp4 que fueron creados con ffmpeg, sin embargo, el archivo de salida resultante no contiene ningún audio, ¿alguien puede ayudarme?

Aquí está mi código actual:

function appendVideo($input, $input_second, $outputfolder, $outputname) {
    // output
    $output = $outputfolder . $outputname;
    // intermediate
    $randomString1 = substr( "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", mt_rand(0, 50) , 1) .substr( md5( time() ), 1);
    $randomString2 = substr( "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", mt_rand(0, 50) , 1) .substr( md5( time() ), 1);
    $intermediate1 = $outputfolder . "i1_".$randomString1.".mpg";
    $intermediate2 = $outputfolder . "i2_".$randomString2.".mpg";
    //convert to mpg

    $exec1 = "ffmpeg -i $input -sameq $intermediate1 2>&1";
    $exec2 = "ffmpeg -i $input_second -sameq $intermediate2 2>&1";

    exec($exec1,$results1,$return1);
    exec($exec2,$results2,$return2);


    // join and convert back
    $exec = "cat $intermediate1 $intermediate2 | ffmpeg -i - -codec:a copy $output 2>&1";
    //delete the intermediate files


    exec ($exec,$results,$return);

        if (file_exists ( $intermediate1 )) {
        unlink ( $intermediate1 );
    }
    if (file_exists ( $intermediate2 )) {
        unlink ( $intermediate2 );
    }

    return $results;

}

Y este es el resultado devuelto por ffmpeg en caso de que ayude:

ffmpeg version 0.10.9 Copyright (c) 2000-2013 the FFmpeg developers
built on Oct 1 2013 19:47:54 with gcc 4.4.7 20120313 (Red Hat 4.4.7-3)
configuration: --prefix=/usr --bindir=/usr/bin --datadir=/usr/share/ffmpeg --incdir=/usr/include/ffmpeg --libdir=/usr/lib64 --mandir=/usr/share/man --arch=x86_64 --extra-cflags='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic' --enable-bzlib --disable-crystalhd --enable-gnutls --enable-libass --enable-libcdio --enable-libcelt --enable-libdc1394 --disable-indev=jack --enable-libfreetype --enable-libgsm --enable-libmp3lame --enable-openal --enable-libopenjpeg --enable-libpulse --enable-librtmp --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-libv4l2 --enable-libx264 --enable-libxvid --enable-x11grab --enable-avfilter --enable-postproc --enable-pthreads --disable-static --enable-shared --enable-gpl --disable-debug --disable-stripping --shlibdir=/usr/lib64 --enable-runtime-cpudetect
libavutil 51. 35.100 / 51. 35.100
libavcodec 53. 61.100 / 53. 61.100
libavformat 53. 32.100 / 53. 32.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
mpeg @ 0x111afc0] Estimating duration from bitrate, this may be inaccurate
nput #0, mpeg, from 'pipe:':
Duration: N/A, start: 1.000000, bitrate: 104985 kb/s
Stream #0:0[0x1e0]: Video: mpeg1video, yuv420p, 768x432 [SAR 1:1 DAR 16:9], 104857 kb/s, 30 fps, 30 tbr, 90k tbn, 30 tbc
Stream #0:1[0x1c0]: Audio: mp2, 44100 Hz, stereo, s16, 128 kb/s
buffer @ 0x1137280] w:768 h:432 pixfmt:yuv420p tb:1/1000000 sar:1/1 sws_param:
libx264 @ 0x11221e0] using SAR=1/1
libx264 @ 0x11221e0] using cpu capabilities: none!
libx264 @ 0x11221e0] profile High, level 3.0
libx264 @ 0x11221e0] 264 - core 120 r2151 a3f4407 - H.264/MPEG-4 AVC codec - Copyleft 2003-2011 - 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 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=12 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=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_lookahead=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
utput #0, mp4, to 'tmp/zdee7489be42d6db4bfe9ce8e67da161.mp4':
Metadata:
encoder : Lavf53.32.100
Stream #0:0: Video: h264 (![0][0][0] / 0x0021), yuv420p, 768x432 [SAR 1:1 DAR 16:9], q=-1--1, 30 tbn, 30 tbc
Stream #0:1: Audio: mp2 (i[0][0][0] / 0x0069), 44100 Hz, stereo, 128 kb/s
Stream mapping:
    Stream #0:0 -> #0:0 (mpeg1video -> libx264)
    Stream #0:1 -> #0:1 (copy)
frame= 46 fps= 0 q=0.0 size= 0kB time=00:00:00.00 bitrate= 0.0kbits/s 
frame= 66 fps= 60 q=29.0 size= 135kB time=00:00:00.26 bitrate=4141.1kbits/s 
frame= 79 fps= 49 q=29.0 size= 257kB time=00:00:00.70 bitrate=3011.9kbits/s 
frame= 93 fps= 44 q=29.0 size= 386kB time=00:00:01.16 bitrate=2711.4kbits/s 
...
frame= 105 fps= 39 q=29.0 size= 487kideo:14440kB audio:3140kB global headers:0kB muxing overhead 1.021247%
[libx264 @ 0x11221e0] frame I:31 Avg QP:18.84 size: 42581
[libx264 @ 0x11221e0] frame P:3369 Avg QP:21.98 size: 3277
[libx264 @ 0x11221e0] frame B:2629 Avg QP:27.40 size: 923
[libx264 @ 0x11221e0] consecutive B-frames: 37.1% 14.2% 0.5% 48.2%
[libx264 @ 0x11221e0] mb I I16..4: 7.6% 68.7% 23.6%
[libx264 @ 0x11221e0] mb P I16..4: 0.6% 1.5% 0.2% P16..4: 20.9% 7.1% 5.3% 0.0% 0.0% skip:64.3%
[libx264 @ 0x11221e0] mb B I16..4: 0.1% 0.1% 0.0% B16..8: 17.2% 3.2% 1.0% direct: 0.7% skip:77.6% L0:39.4% L1:51.8% BI: 8.8%
[libx264 @ 0x11221e0] 8x8 transform intra:64.8% inter:69.2%
[libx264 @ 0x11221e0] coded y,uvDC,uvAC intra: 57.6% 72.7% 35.5% inter: 7.6% 11.8% 0.6%
[libx264 @ 0x11221e0] i16 v,h,dc,p: 41% 21% 16% 21%
[libx264 @ 0x11221e0] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 23% 21% 30% 5% 3% 3% 5% 4% 7%
[libx264 @ 0x11221e0] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 31% 23% 12% 4% 5% 5% 7% 6% 6%
[libx264 @ 0x11221e0] i8c dc,h,v,p: 44% 24% 25% 7%
[libx264 @ 0x11221e0] Weighted P-Frames: Y:0.7% UV:0.5%
[libx264 @ 0x11221e0] ref P L0: 69.8% 12.5% 10.8% 6.8% 0.0%
[libx264 @ 0x11221e0] ref B L0: 89.9% 8.5% 1.6%
[libx264 @ 0x11221e0] ref B L1: 97.2% 2.8%
[libx264 @ 0x11221e0] kb/s:588.6

Respuestas:


1

Solo puedo adivinar aquí lo que está tratando de lograr, pero la solución inmediata a su problema sería usarlo en -c:a aac -strict experimentallugar de hacerlo -codec:a copy. Sus archivos .mpg usan el mp2códec de audio que aparentemente no es compatible con un contenedor MP4.

Pero, de nuevo, hay bastantes cosas mal aquí. Al realizar la conversión .mpgsin opciones adicionales, está creando video MPEG-1, que da como resultado una calidad horrible o archivos terriblemente grandes. Además, -sameqno hace lo que espera que haga . Por favor olvida esa opción. Por último, la doble conversión introduce pérdida de calidad.

Primero, actualice a una versión reciente deffmpeg . Luego, lea la guía en Cómo concatenar (unir, fusionar) archivos multimedia , especialmente la parte sobre el concatfiltro. Allí puede concatenar dos archivos directamente sin necesidad de intermedios.


Muchas gracias slhck! Aquí hay un poco más de información. Estoy creando un software que toma un archivo mp4 de youtube (que toma mi software) y agrega una introducción y / o salida al video creado por mis usuarios a través del software. Los videos de introducción, outro y youtube están codificados con ffmpeg. Y SÍ, cuando esto FUNCIONA, el archivo que genera es ENORME. Definitivamente voy a actualizar mi versión de ffmpeg.
Jeff Long,

Muy bien skhck, actualización rápida ... lo que sugirió con el uso de -c: un experimento estricto aac realmente funcionó y el video de salida ahora contiene ambos audios :) ¡GRACIAS por eso! No supongo que estarías dispuesto a decirme cómo desvanecer mi video de introducción y desvanecerme en el próximo video, ¿verdad?
Jeff Long,

Hola a todos, actualicé mi versión de ffmpeg a la más reciente y los videos se están uniendo bien, sin embargo, el problema principal ahora es que el audio y el video no están sincronizados ... ¿Hay alguna otra ayuda disponible aquí sobre este tema?
Jeff Long

¡Hola Jeff! Le sugiero que publique una nueva pregunta para el error de sincronización que recibe e incluya el comando real y la salida de la línea de comando. En cuanto a su var_dump(), es posible que pueda dividirlo explode()en nuevas líneas.
slhck

Aquí está mi publicación con la pregunta fuera de sincronización. Por favor, vea si puede ayudarme, he estado despierto casi 60 horas seguidas, amigo mío, y estoy a punto de perderlo aquí, jaja, ¡gracias! superuser.com/questions/697492/…
Jeff Long

0

FFmpeg puede usar más de un archivo de entrada para generar un archivo de salida. Quizás pruebe la opción -concat en lugar de usar 'cat' para combinarlos.

documentación sobre eso: http://trac.ffmpeg.org/wiki/How%20to%20concatenate%20(join,%20merge)%20media%20files

Además, la versión 2.1 es la última versión:


@slhck me ganó a la opción concat. Sí, y ni siquiera noté la incongruencia con el audio vs contenedor. Gracias
Nate

-1

Actualicé a ffmpeg-3.0 siguiendo todas las instrucciones en la página siguiente.

http://ask.xmodulo.com/compile-ffmpeg-centos-fedora-rhel.html

La compilación tardó 10 minutos y recibí un error por no poder abrir libavdevice.so.57 que resolví de https://stackoverflow.com/questions/12901706/ffmpeg-error-in-linux . Funcionó bien. Podría unir varios videos mp4 juntos usando ffmpeg -f concat -i list.txt -c copy Final_Video.mp4


1
Si bien esto puede responder teóricamente la pregunta, sería preferible incluir aquí las partes esenciales de la respuesta y proporcionar el enlace para referencia.
Mokubai
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.