Convertir por lotes .mkv a .mp4

10

Quiero convertir por lotes todos los archivos .mkv en una carpeta a .mp4 con VLC.

Debería usar la transmisión original de audio y video y, si es posible, el subtítulo .ass del .mkv. No es realmente una conversión, es más como cambiar el contenedor: mi reproductor no puede leer los videos de MKV.

Si hago esta conversión a mano (manualmente) funciona, pero tengo muchos archivos MKV para convertir, por lo que tomaría mucho tiempo.

He buscado en Internet un archivo por lotes para hacer esto y encontré algunos. Intenté modificarlos a mi gusto, pero todos los intentos que probé acaban de crear un archivo .mp4 que no contiene la transmisión de audio y la transmisión de video tampoco puede ser reproducida por todos mis reproductores multimedia en la PC.

Entonces, ¿podría alguien decirme cómo debe verse el lote, para que funcione con el video original y la transmisión de audio (y tal vez los subtítulos .ass)?

Estoy aquí
fuente
¿En qué sistema operativo estás, y necesariamente tienes que usar VLC? Además, ISO MP4 no admite subtítulos por lo que recuerdo, ¿qué se debe hacer al respecto?
slhck
para una prueba puedes probar con otro jugador (mplayer / KMPlayer / BSPlayer)
Remus Rigo
Freno de mano, eso es todo.
Sam
@Sam Handbrake volverá a codificar las transmisiones de video y audio, dejándote con mala calidad como resultado. Además, esto es lo que el OP específicamente no quería.
slhck

Respuestas:

13

mkvtomp4

Parece que mkvtomp4es lo que quieres?

Utiliza mpeg4ip o MP4Box, mkvtoolnix y ffmpeg de GPAC para convertir archivos mkv problemáticos a mp4 . La conversión no vuelve a codificar el video y solo vuelve a codificar el audio si no usa el códec AAC (se puede anular este comportamiento usando --audio-codec).

Puede descargar versiones de Windows y Linux en la página de Google Code. Sin embargo, necesitará software adicional.

Verifique los sitios para descargas para Windows o Linux. En OS X, solo necesita hacerlo brew install mkvtoolnix mp4boxsi tiene Homebrew .

Sin embargo, esto no copiará tus subtítulos. Necesitarás un paso adicional.


FFmpeg batch

Si mkvtomp4 no funciona para usted, también podría funcionar un simple archivo por lotes de FFmpeg . Para Windows, puede descargar las compilaciones de Zeranoe . En Linux, verifique FFmpeg desde las fuentes del paquete. En OS X, use brew install ffmpeg.

Entonces, solo llame:

ffmpeg -i input.mkv -c:v copy -c:a copy output.mp4

Esto creará un contenedor MP4 válido sin volver a codificar. Recorra los archivos según sea necesario y esté disponible por su sistema operativo. Sin embargo, este lote no copiará subtítulos.

En * nix, puede hacer lo siguiente. Solo crea un archivo convert.sh:

#!/bin/bash
find /path/to/input/folder -iname '*.mkv' -print0 | while read -d '' -r file; do
    ffmpeg -i "$file" -c:v copy -c:a copy ${file%%.mkv}.mp4
done

Reemplace la ruta a su carpeta de video aquí. Hazlo ejecutable con chmod +x convert.sh, luego ejecútalo con ./convert.sh.

En Windows, probablemente necesite dos archivos Batch (un complemento descarado desde aquí ), uno de ellos es startconvert.bat:

for %%i IN (*.mkv) DO (convert-to-mp4.bat "%%i") 
pause

Y uno que realiza la conversión:

IF EXIST "%1.mp4" GOTO exit

@echo Conversion for %1 started on %DATE% %TIME% 
ffmpeg -i %1 -c:v copy -c:a copy %1.mp4

:exit 
@echo %1.mp4 already exists

Guarde ambos en la carpeta de video. Simplemente ejecute startconvert.batdesde la carpeta desde la que desea iniciar la conversión.


Subtítulos

Si desea agregar los subtítulos, es posible que necesite un procedimiento manual si lo siguiente no funciona para usted:

ffmpeg -i input.mkv -c:a copy -c:v copy -map 0 output.mp4

Para extraer subtítulos, use:

mkvextract tracks input.mkv 3:subtitles.srt

Esto supone que su archivo realmente contiene los subtítulos en el número de identificación de la pista 3 y se pueden exportar al formato SRT. Para verificar si un archivo realmente contiene subtítulos en la pista 3, use mkvmerge -i input.mkv.

Luego, use MP4Box para volver a agregar los subtítulos al archivo MP4.

mp4box -add input.mp4 -add subtitles.srt -new output.mp4
slhck
fuente
Para el registro, probé FFmpeg y la extracción de subtítulos en OS X y funcionó a la perfección.
slhck
Usé el ffmpeg para Windows. ¿Pero hay un lote que convierte / mux automáticamente todos los archivos de la carpeta a mp4 con el mismo nombre de archivo? O tal vez un lote que convierte el archivo en arrastrar y soltar
2

Este es un ajuste de parte de la respuesta que dio slhck (y gracias, ¡slhck!) Porque descubrí que el comando no funcionó para el último ffmpeg (al momento de escribir esto), ¿tal vez los parámetros han cambiado entre versiones?

En Windows 7, usando ffmpeg v.20130103-git-9e36d9e-win64-static (descomprímalo con la utilidad 7zip), que se encuentra en http://ffmpeg.zeranoe.com/builds/ a su vez en http://ffmpeg.org /download.html , el siguiente comando convirtió un archivo .mov (tomado de un iPhone) en un archivo .mp4:

ffmpeg -i test.mov -vcodec copy -acodec copy test.mp4

Descubrí que cambiar la parte .mp4 de esto a .avi también funcionaba, cambiarlo a un contenedor .avi. Con cualquiera de los contenedores de destino, el uso de estos parámetros "-vcodec copy -acodec copy" parece copiar solo las secuencias de origen en un nuevo contenedor (en el destino), por lo que es una conversión sin pérdidas (y supongo que ese sería el caso con un variedad de contenedores de destino, también).

Estos ajustes de los lotes que slhck me dio también funcionaron para mí:

callConvert.bat:

for %%i IN (*.mov) DO (convert.bat "%%i")
pause

convert.bat:

IF EXIST %1.mov GOTO exit

@echo Conversion for %1 started on %DATE% %TIME% 
ffmpeg -i %1 -vcodec copy -acodec copy %1.avi

:exit 
@echo %1.avi already exists
r_alex_hall
fuente
1
No hay diferencia entre -c:ay -acodec, o -c:vy -vcodec. De hecho, todavía estoy usando el primero hoy, ya que es la sintaxis recomendada, y ambas se mencionan en la documentación de FFmpeg . Tenga en cuenta que la conversión del contenedor a AVI puede romperse para muchos códecs de video y audio, ya que los archivos AVI carecen de soporte para la codificación predictiva (que utiliza el video H.264, el que le brinda el iPhone). Si no utiliza un contenedor MP4 o MOV como destino, siempre es mejor volver a codificar.
slhck
"IF EXIST% 1.mov GOTO exit" debería leer "% 1.avi" (o cualquiera que sea el formato de destino, en lugar del formato de origen) en su lugar, ¿no? Aparte de eso, esto funcionó muy bien para mí, ¡gracias!
kjosh
0

Antigua pregunta, pero aquí está mi respuesta, para que conste. MP4 no puede hacer subtítulos a menos que formen parte del cuadro de video, pero así es como convierto archivos .mkv a .mp4:

foreach($inputFile in get-childitem -recurse -Filter *.mkv) {
    $outputFileName = [System.IO.Path]::GetFileNameWithoutExtension($inputFile.FullName) + ".mp4";
    $outputFileName = [System.IO.Path]::Combine($inputFile.DirectoryName, $outputFileName);

    $progDir = ${env:ProgramFiles(x86)};
    if ($progDir -eq $null) {
        $progDir = $env:ProgramFiles;
    }

    $processName = $progDir + "\VideoLAN\VLC\vlc.exe";
    $processArgs = "-I dummy -v `"$($inputFile.FullName)`" --sout=#transcode{}:standard{access=`"file`",mux=`"mp4`",dst=`"$outputFileName`"} vlc://quit"

    start-process $processName $processArgs -wait
}

Guárdelo como mkv2mp4.ps1 y suéltelo en la carpeta con la que está trabajando. Haga clic derecho y "Abrir en Powershell" y hará lo suyo.

Esta es la primera vez que he visto Powershell (y la última que espero, ¿por qué MS no pudo simplemente portar Bash?) Pero funciona para mí y se basa en el código que encontré aquí: https: // wiki .videolan.org / How_to_Batch_Encode / # Powershell

miken32
fuente
Independientemente de la línea de comando que use, debe colocarla dentro de Makefile- para poder volver a ejecutarla y convertir solo las nuevas fuentes, así como para poder ejecutar múltiples conversiones en paralelo (para hacer uso de todas sus CPU )
Mikhail T.