2012-09-12 29 views
8

Estoy usando ffmpeg para convertir un video de 1080p a MP4 usando este comando en PHP.¿Cómo puedo limitar el uso de memoria de ffmpeg?

$command = FFMPEG.' -i ' . $src . ' -sameq -strict -2 -vcodec libx264 -ar 22050 -y ' . $dest.'.mp4 2>&1'; 
exec($command,$output,$status); 

El problema es que el proceso utiliza una gran cantidad de memoria ~ 1600MB, el cual no está permitido por mi servidor para ffmpeg se termina. ¿Puedo limitar el uso de memoria de ffmpeg a unos 600-700 MB?

Cualquier ayuda es muy apreciada ...

Respuesta

3

No se trata de PHP. Se trata de cómo limitar el uso de memoria FFMPEG.

Respuesta corta no!

vistazo aquí: http://hwdmediashare.co.uk/forum/27-development-customisation/54700-limit-ffmpeg-memory-usage

+0

¿Qué otras opciones tengo para lograr el objetivo (convertir el archivo 1080p .mov a la misma calidad mp4) ?? – Khan

+0

@Khan, parece que solo quieres transformar y no necesariamente codificar el video. Entonces puedes hacerlo con muy poco requerimiento de memoria. Ver mi respuesta arriba. – av501

0

La verdad es que el vídeo que codifica un trabajo intensivo de la CPU y la memoria. Si quiere hacerlo, necesita darle la memoria necesaria para ello.

Dado que desea convertir un .mov de 1080p a un .mp4 de la misma calidad, asumo que no quiere cambiar el formato del archivo ni volver a codificarlo.

ffmpeg -i input.mov -acodec copia copia -vcodec out.mp4

lo hará en un instante y sin que ninguno de los gastos generales de memoria

Si desea que su codec de audio sólo cambió Don' t dar la parte acodec.

Si el códec de video de entrada no funciona para usted [así que copiar no es una opción] intente hacer la codificación mpeg4 para vcodec. Más barato para codificar allí, pero no puedo asegurarle que siempre se ajustará a sus requisitos de memoria.

+0

Gracias av501! el comando funciona para el archivo mov. pero mi archivo de entrada puede estar en cualquier formato (flv, mp4, mov, wmv, etc.). En realidad, estoy tratando de convertir cualquier video proporcionado por el usuario a formato mp4 y ogv sin ninguna pérdida de calidad. Es eso posible ? aquí está mi comando para ogv: ffmpeg -i input.wmv -c: v libtheora -q: v 7 -c: a libvorbis -q: a 5 -y output.ogv – Khan

+0

Si el formato de salida permite los códecs que el archivo de entrada tiene [codecs] y luego sí está permitido. Entonces mov => mp4 es 100% posible porque tienen el mismo formato [diferencias menores]. [mp4 3gp mov son prácticamente uno y el mismo] wmv => mp4 depende del códec que tiene en wmv. flv a mp4 también funcionará cuando flv tenga h.264. Por lo menos esto debería funcionar para tales archivos. Para otros archivos, deberá transcodificar. – av501

1

Sería el códec de video el principal responsable del uso de alta memoria.

Así que es el codificador cuyo uso de memoria debe abordarse, no FFmpeg directamente. No estoy seguro de cómo corregir el uso de memoria de x264, pero probé con el nuevo x26 y en mi caso solo está utilizando 1.6 GB, mientras que libx264 fallaba al pedir más que el límite de memoria de 2 GB (por proceso, en sistemas de 32 bits).

Por lo tanto, lo que funcionó para mí era utilizar:

ffmpeg -i input -pix_fmt yuv420p -c:v hevc -x265-params crf=23 out.mp4 

(La omisión de parámetros para cuidar del audio.)

Pero el enfoque general es tratar otros codificadores. Iba a probar mpeg4 y vp9 si x265 no funcionaba, tal vez otros. Si nada de esto funciona, a continuación, otras opciones incluyen mirar la configuración de los codificadores (aunque nada obvia y directamente relevante para el uso de memoria se muestra):

ffmpeg -h encoder=mpeg4 

Actualización: de hecho, resultó que YouTube doesn Aún no he aceptado HEVC (también conocido como H.265) (y solo me avisó cuando finalizó la carga). Entonces, como sugerí anteriormente, opté por la VP9, ​​esta vez hice una prueba piloto con los primeros 50 cuadros.He utilizado una configuración similar a a guide encontré (los constantes ajustes de calidad, a pesar de que debería haber utilizado más de sus parámetros sugeridos):

ffmpeg.exe -i <input> -pix_fmt yuv420p -c:v libvpx-vp9 -pass 1 -b:v 0 -crf 20 -f webm pass1.webm 

ffmpeg.exe -i <input> -pix_fmt yuv420p -c:v libvpx-vp9 -pass 2 -b:v 0 -crf 20 -f webm pass2.webm 

(Tenga en cuenta que pass1.webm habrá casi vacío.)

también tenga en cuenta que se prefieren dos pases siempre que sea posible. Es mejor en todos los frentes, incluida una codificación más rápida en general.

Con estos ajustes, un clip de 73 segundos a una resolución de 4K tardó unas 16 horas en codificarse, es decir, utilizando un núcleo, ya que olvidé especificar -threads. Aunque lento, el uso de la memoria de FFmpeg solo aumentó a aproximadamente 0.6 GB. El archivo resultante era de 300 MB, y no puedo ver ninguna pérdida de calidad en comparación con los marcos sin comprimir (por lo que -crf 20 podría haber sido demasiado bajo).

Cuestiones relacionadas