Conversion par lots .mkv en .mp4

10

Je veux convertir par lots tous les fichiers .mkv d'un dossier en .mp4 avec VLC.

Il doit utiliser le flux vidéo / audio d'origine et, si possible, le sous-titre .ass du .mkv. Ce n'est pas vraiment une conversion, c'est plus comme changer le conteneur - mon lecteur ne peut pas lire les vidéos MKV.

Si je fais cette conversion à la main (manuellement), cela fonctionne, mais j'ai beaucoup de fichiers MKV à convertir, donc cela prendrait beaucoup de temps.

J'ai cherché sur Internet un fichier de commandes pour ce faire et j'en ai trouvé quelques-uns. J'ai essayé de les modifier à mon souhait, mais toutes les tentatives que j'ai essayées ont juste créé un fichier .mp4 qui ne contient pas le flux audio et le flux vidéo ne peut pas non plus être rendu par tous mes lecteurs multimédias sur le PC.

Alors, quelqu'un pourrait-il me dire à quoi doit ressembler le lot, afin qu'il fonctionne avec le flux vidéo et audio d'origine (et peut-être les sous-titres .ass)?

Je suis là
la source
Sur quel système d'exploitation êtes-vous et devez-vous nécessairement utiliser VLC? De plus, ISO MP4 ne prend pas en charge les sous-titres pour autant que je m'en souvienne - que faut-il faire à leur sujet?
slhck
pour un test, vous pouvez essayer un autre joueur (mplayer / KMPlayer / BSPlayer)
Remus Rigo
Frein à main, c'est tout.
Sam
@Sam Handbrake ré-encodera les flux vidéo et audio, vous laissant ainsi une mauvaise qualité. C'est aussi ce que l'OP ne voulait pas spécifiquement.
slhck

Réponses:

13

mkvtomp4

On dirait que mkvtomp4c'est ce que tu veux?

Utilise mpeg4ip ou MP4Box, mkvtoolnix et ffmpeg de GPAC pour convertir des fichiers mkv gênants en mp4 . La conversion ne réencode pas la vidéo et ne réencode l'audio que si elle n'utilise pas le codec AAC (on peut remplacer ce comportement en utilisant --audio-codec).

Vous pouvez télécharger les versions Windows et Linux sur la page Code Google. Vous aurez cependant besoin de logiciels supplémentaires.

Vérifiez les sites pour les téléchargements pour Windows ou Linux. Sur OS X, vous ne devez le faire que brew install mkvtoolnix mp4boxsi vous avez Homebrew .

Cependant, cela ne copiera pas vos sous-titres. Vous aurez besoin d'une étape supplémentaire.


Lot FFmpeg

Si mkvtomp4 ne fonctionne pas pour vous, un simple fichier batch FFmpeg pourrait également le faire. Pour Windows, vous pouvez télécharger les versions de Zeranoe . Sous Linux, vérifiez FFmpeg à partir des sources de package. Sous OS X, utilisez brew install ffmpeg.

Ensuite, appelez simplement:

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

Cela créera un conteneur MP4 valide sans ré-encodage. Parcourez les fichiers en fonction des besoins et de votre système d'exploitation. Ce lot ne copiera cependant pas les sous-titres.

Dans * nix, vous pouvez effectuer les opérations suivantes. Créez simplement un fichier 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

Remplacez le chemin d'accès à votre dossier vidéo ici. Rendez-le exécutable avec chmod +x convert.sh, puis exécutez-le avec ./convert.sh.

Sous Windows, vous avez probablement besoin de deux fichiers batch ( plug sans vergogne d'ici ), l'un étant startconvert.bat:

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

Et celui qui effectue la conversion:

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

Enregistrez les deux dans le dossier vidéo. Exécutez simplement startconvert.batle dossier à partir duquel vous souhaitez démarrer la conversion.


Les sous-titres

Si vous souhaitez ajouter les sous-titres, vous devrez peut-être une procédure manuelle si les éléments suivants ne fonctionnent pas pour vous:

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

Pour extraire les sous-titres, utilisez:

mkvextract tracks input.mkv 3:subtitles.srt

Cela suppose que votre fichier contient vraiment les sous-titres à l'ID de piste numéro 3 et qu'ils peuvent être exportés au format SRT. Pour vérifier si un fichier contient vraiment des sous-titres sur la piste 3, utilisez mkvmerge -i input.mkv.

Ensuite, utilisez MP4Box pour ajouter à nouveau les sous-titres au fichier MP4.

mp4box -add input.mp4 -add subtitles.srt -new output.mp4
slhck
la source
Pour mémoire, j'ai testé FFmpeg et l'extraction des sous-titres sur OS X et cela a fonctionné parfaitement.
slhck
J'ai utilisé le ffmpeg pour Windows. Mais y a-t-il un lot pour qu'il convertisse / mux automatiquement tous les fichiers du dossier en mp4 avec le même nom de fichier? Ou peut-être un lot qui convertit le fichier par glisser-déposer
2

C'est une partie de la réponse donnée par slhck (et merci, slhck!) Parce que j'ai trouvé que la commande ne fonctionnait pas pour la dernière ffmpeg (à ce jour) - peut-être que les paramètres ont changé entre les versions?

Sur Windows 7, en utilisant ffmpeg v.20130103-git-9e36d9e-win64-static (décompressez-le avec l'utilitaire 7zip), trouvé via http://ffmpeg.zeranoe.com/builds/ tour à tour via http://ffmpeg.org /download.html , la commande suivante a converti un fichier .mov (extrait d'un iPhone) en un fichier .mp4:

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

J'ai trouvé que changer la partie .mp4 de cela en .avi fonctionnait aussi, pour la changer en un conteneur .avi. Avec l'un ou l'autre conteneur cible, l'utilisation de ces paramètres "-vcodec copy -acodec copy" semble copier uniquement les flux source dans un nouveau conteneur (dans la cible), donc c'est une conversion sans perte (et je suppose que ce serait le cas avec un variété de conteneurs cibles, aussi).

Ces réglages des lots donnés par slhck ont ​​également fonctionné pour moi:

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
la source
1
Il n'y a pas de différence entre -c:aet -acodec, ou -c:vet -vcodec. En fait, j'utilise toujours le premier aujourd'hui, car c'est la syntaxe recommandée, et les deux sont mentionnés dans la documentation FFmpeg . Notez que la conversion du conteneur en AVI peut casser pour de nombreux codecs vidéo et audio, car les fichiers AVI ne prennent pas en charge le codage prédictif (que la vidéo H.264 utilise - celui que l'iPhone vous offre). Si vous n'utilisez pas de conteneur MP4 ou MOV comme cible, il est toujours préférable de ré-encoder.
slhck
"IF EXIST% 1.mov GOTO exit" devrait se lire "% 1.avi" (ou quel que soit le format cible, au lieu du format source) à la place, non? A part cela, cela a très bien fonctionné pour moi, merci!
kjosh
0

Vieille question, mais voici ma réponse, pour mémoire. MP4 ne peut pas faire de sous-titres à moins qu'ils ne fassent partie de l'image vidéo, mais voici comment convertir des fichiers .mkv en .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
}

Enregistrez-le sous mkv2mp4.ps1 et déposez-le dans le dossier avec lequel vous travaillez. Faites un clic droit et "Ouvrir dans Powershell" et il fera son travail.

C'est la première fois que je regarde même Powershell (et la dernière j'espère - pourquoi MS ne pourrait-il pas simplement porter Bash?!) Mais cela fonctionne pour moi et est basé sur le code que j'ai trouvé ici: https: // wiki .videolan.org / How_to_Batch_Encode / # Powershell

miken32
la source
Quelle que soit la ligne de commande que vous utilisez, vous devez la placer dans un Makefile- afin de pouvoir la réexécuter et convertir uniquement les nouvelles sources ainsi que pour pouvoir exécuter plusieurs conversions en parallèle (pour utiliser tous vos processeurs ).
Mikhail T.