Respuestas:
La respuesta anterior solo creará 1 archivo de salida llamado out.mov. Para crear un archivo de salida separado para cada película anterior, intente esto.
for i in *.avi;
do name=`echo "$i" | cut -d'.' -f1`
echo "$name"
ffmpeg -i "$i" "${name}.mov"
done
i was unexpected at this time.
do name=`echo "${i%.*}"`;
funcionará en nombres de archivo con puntos (y espacios) en ellos.
.bat
Windows?
Para Linux y macOS, esto se puede hacer en una línea, usando la expansión de parámetros para cambiar la extensión del nombre de archivo del archivo de salida:
for i in *.avi; do ffmpeg -i "$i" "${i%.*}.mp4"; done
ffmpeg
no puede ingresar y salir al mismo archivo. 2) No estoy seguro si los comandos Bash funcionan en Windows 10 de forma nativa. Tal vez debería agregar a la respuesta que está dirigido a sistemas que pueden usar Bash de forma nativa, como Linux y macOS. lxs proporcionó una respuesta de Windows para esta pregunta.
for f in *.mkv; do ffmpeg -i "$f" -map 0 -movflags faststart -c:v libx264 -c:a copy -c:s copy "${f/x265/x264}"; done
Y en Windows:
FOR /F "tokens=*" %G IN ('dir /b *.flac') DO ffmpeg -i "%G" -acodec mp3 "%~nG.mp3"
FOR /F "tokens=*" %G IN ('dir /b *.mp3') DO ffmpeg -i "%G" -map_metadata -1 -c:v copy -c:a copy "%~nG .mp3"
Un script bash de una línea sería fácil de hacer; reemplácelo *.avi
con su tipo de archivo:
for i in *.avi; do ffmpeg -i "$i" -qscale 0 "$(basename "$i" .avi)".mov ; done
-qscale
. Elimínelo y use la configuración predeterminada, o use -crf
en su lugar (el valor predeterminado es -crf 23
).
basename
no se cita la subshell invertida . Esto es exactamente por qué bash tiene expansión de shell en su lugar: para i en * .avi; do ffmpeg -i "$ i" -qscale 0 "$ (nombre base" $ i ".avi)". mov; hecho
Para convertir con subdirectorios, use eg
find . -exec ffmpeg -i {} {}.mp3 \;
find -name "*.vtt" -exec ffmpeg -i {} {}.srt \;
find *.mp4 -exec ffmpeg -i {} {}.mp3 \;
find . -name *.ogg -or -name *.wma -exec ffmpeg -i {} {}.mp3 \;
find . -name *.wma -exec ffmpeg -i {} {}.mp3 \; -exec rm {} \;
Para ventanas:
Aquí estoy convirtiendo todos los archivos (.mp4) a archivos (.mp3).
Simplemente abra cmd, vaya a la carpeta deseada y escriba el comando.
Acceso directo: (opcional)
1. Vaya a la carpeta donde están presentes sus archivos (.mp4)
2. Presione Mayús y haga clic con el botón izquierdo y elija "Abrir ventana de PowerShell aquí"
o "Abrir ventana de símbolo del sistema aquí"
3. Escriba "cmd" [NOTA : Omita este paso si abre directamente cmd en lugar de PowerShell]
4. Ejecute el comando
for %i in (*.mp4) do ffmpeg -i "%i" "%~ni.mp3"
Si desea poner esto en un archivo por lotes en Windows 10, debe usar %% i.
Para cualquiera que quiera convertir por lotes cualquier cosa con ffmpeg pero le gustaría tener una interfaz conveniente de Windows, desarrollé este front-end:
https://sourceforge.net/projects/ffmpeg-batch
Agrega a ffmpeg una interfaz de moda de ventana, barras de progreso e información restante del tiempo, características que siempre eché de menos al usar ffmpeg.
Si tiene GNU en paralelo , puede convertir todos los archivos .avi a continuación vid_dir
a mp4 en paralelo, utilizando todos excepto uno de los núcleos de su CPU con
find vid_dir -type f -name '*.avi' -not -empty -print0 |
parallel -0 -j -1 ffmpeg -loglevel fatal -i {} {.}.mp4
Para convertir de / a diferentes formatos, cambie '*.avi'
o .mp4
según sea necesario. GNU paralela figura en la mayoría de los repositorios de distribuciones de Linux en un paquete que generalmente se llama parallel
.
!
al final de cualquiera de las frases de bash?
Sé que esto podría ser redundante, pero uso este script para convertir archivos por lotes.
old_extension=$1
new_extension=$2
for i in *."$old_extension";
do ffmpeg -i "$i" "${i%.*}.$new_extension";
done
Se necesitan 2 argumentos para hacerlo más flexible:
Creo un alias para él, pero también puede usarlo manualmente de esta manera:
sh batch_convert.sh mkv mp4
Esto convertiría todos los mkv
archivos en mp4
archivos.
Como puedes ver, es un poco más versátil. Siempre que ffmpeg
pueda convertirlo, puede especificar dos extensiones.
Obteniendo un poco como el código de golf aquí, pero dado que casi todas las respuestas hasta ahora son bash (salvo una sola cmd), aquí hay un comando multiplataforma de Windows que usa powershell (porque es increíble):
ls *.avi|%{ ffmpeg -i $_ <ffmpeg options here> $_.name.replace($_.extension, ".mp4")}
Puede cambiar * .avi a lo que coincida con su metraje original.
Por supuesto, ahora PowerShell ha aparecido, diseñado específicamente para hacer que algo como esto sea extremadamente fácil.
Y sí, PowerShell también está disponible en otros sistemas operativos además de Windows, pero viene preinstalado en Windows, por lo que esto debería ser útil para todos.
Primero, querrás enumerar todos los archivos dentro del directorio actual, así que comenzaremos con:
ls
También puede usar ls -Recurse
si desea convertir recursivamente todos los archivos en subdirectorios también.
Luego, los filtraremos solo al tipo de archivo que queremos convertir, por ejemplo, "avi".
ls | Where { $_.Extension -eq ".avi" }
Después de eso, pasaremos esa información a FFmpeg a través de un ForEach
.
Para la entrada de FFmpeg, usaremos FullName
: esa es la ruta completa al archivo. Y para la salida de FFmpeg usaremos el Name
- pero reemplazando el .avi
al final con .mp3
. Entonces, se verá más o menos así:
$_.Name.Replace(".avi", ".mp3")
Entonces, juntemos todo eso y este es el resultado:
ls | Where { $_.Extension -eq ".avi" } | ForEach { ffmpeg -i $_.FullName $_.Name.Replace(".avi", ".mp3") }
Eso convertirá todos los archivos ".avi" en archivos ".mp3" a través de FFmpeg, simplemente reemplace las tres cosas entre comillas para decidir qué tipo de conversión desea y siéntase libre de agregar cualquier otro argumento a FFmpeg dentro de ForEach
.
Podría llevar esto un paso más allá y agregarlo Remove-Item
al final para eliminar automáticamente los archivos antiguos.
Si ffmpeg
no está en su camino, y en realidad está en el directorio en el que se encuentra actualmente, escriba ./ffmpeg
allí en lugar de solo ffmpeg
.
Espero que esto ayude a cualquiera.
.ps1
archivo, no en un .bat
archivo. Tendrá que ejecutar Set-ExecutionPolicy RemoteSigned
como administrador si nunca antes ha ejecutado un script PS.
ventanas:
@echo off
for /r %%d in (*.wav) do (
ffmpeg -i "%%~nd%%~xd" -codec:a libmp3lame -c:v copy -qscale:a 2 "%
%~nd.2.mp3"
)
esta es una tasa de bits variable de calidad 2, puede establecerla en 0 si lo desea, pero a menos que tenga un sistema de altavoces realmente bueno, no tiene valor
Si desea una interfaz gráfica para procesar por lotes con ffmpegX, pruebe Quick Batcher . Es gratis y tomará su última configuración de ffmpegX para convertir los archivos que coloque en ella.
Tenga en cuenta que no puede arrastrar y soltar carpetas en Quick Batcher. Por lo tanto, seleccione los archivos y luego póngalos en Quick Batcher.
Solo este funcionó para mí, tenga en cuenta que debe crear la carpeta "newfiles" manualmente donde se encuentra el archivo ffmpeg.exe.
Convert . archivos a .wav Código de audio:
for %%a in ("*.*") do ffmpeg.exe -i "%%a" "newfiles\%%~na.wav"
pause
es decir, si desea convertir todos los archivos .mp3 a .wav, cambie ("*.*")
a ("*.mp3")
.
El autor de este script es:
https://forum.videohelp.com/threads/356314-How-to-batch-convert-multiplex-any-files-with-ffmpeg
Espero que haya ayudado 🙏.
Esto creará video mp4 de todos los archivos jpg del directorio actual.
echo exec("ffmpeg -framerate 1/5 -i photo%d.jpg -r 25 -pix_fmt yuv420p output.mp4");
Y para Windows, esto no funciona
FOR /F "tokens=*" %G IN ('dir /b *.flac') DO ffmpeg -i "%G" -acodec mp3 "%~nG.mp3"
incluso si doblo esos %
.
Incluso sugeriría:
-acodec ***libmp3lame***
además:
FOR /F "tokens=*" %G IN ('dir /b *.flac') DO ffmpeg -i "%G" -acodec libmp3lame "%~nG.mp3"
Esto es lo que uso para convertir por lotes avi a 1280x mp4
FOR /F "tokens=*" %%G IN ('dir /b *.avi') DO "D:\Downloads\ffmpeg.exe" -hide_banner -i "%%G" -threads 8 -acodec mp3 -b:a 128k -ac 2 -strict -2 -c:v libx264 -crf 23 -filter:v "scale=1280:-2,unsharp=5:5:1.0:5:5:0.0" -sws_flags lanczos -b:v 1024k -profile:v main -preset medium -tune film -async 1 -vsync 1 "%%~nG.mp4"
Funciona bien como un archivo cmd, ejecútelo, el bucle encuentra todos los archivos avi en esa carpeta.
llama a MY (cambio por el tuyo) ffmpeg, pasa el nombre de entrada, la configuración es para reescalar con nitidez. Los problemas no necesitan CRF y " -b:v 1024k
" ...
El archivo de salida es el archivo de entrada menos la extensión, con mp4 como nueva ext.
Estoy usando este one-liner en linux para convertir archivos (generalmente H265) en algo que puedo jugar en Kodi sin problemas:
for f in *.mkv; do ffmpeg -i "$f" -c:v libx264 -crf 28 -c:a aac -b:a 128k output.mkv; mv -f output.mkv "$f"; done
Esto se convierte en un archivo temporal y luego reemplaza el original para que los nombres sigan siendo los mismos después de la conversión.
Además, si desea la misma conversión en subcarpetas. Aquí está el código recursivo.
for /R "folder_path" %%f in (*.mov,*.mxf,*.mkv,*.webm) do (
ffmpeg.exe -i "%%~f" "%%~f.mp4"
)
pequeño script php para hacerlo:
#!/usr/bin/env php
<?php
declare(strict_types = 1);
if ($argc !== 2) {
fprintf ( STDERR, "usage: %s dir\n", $argv [0] );
die ( 1 );
}
$dir = rtrim ( $argv [1], DIRECTORY_SEPARATOR );
if (! is_readable ( $dir )) {
fprintf ( STDERR, "supplied path is not readable! (try running as an administrator?)" );
die(1);
}
if (! is_dir ( $dir )) {
fprintf ( STDERR, "supplied path is not a directory!" );
die(1);
}
$files = glob ( $dir . DIRECTORY_SEPARATOR . '*.avi' );
foreach ( $files as $file ) {
system ( "ffmpeg -i " . escapeshellarg ( $file ) . ' ' . escapeshellarg ( $file . '.mp4' ) );
}
escapeshellarg()
, y funciona tanto en Windows como en Linux. Estoy de acuerdo en que es un caso extremo sin embargo.
Otra solución simple que aún no se ha sugerido sería usar xargs
:
ls *.avi | xargs -i -n1 ffmpeg -i {} "{}.mp4"
Un inconveniente menor es la denominación incómoda de los archivos de salida (por ejemplo input.avi.mp4
). Una posible solución para esto podría ser:
ls *.avi | xargs -i -n1 bash -c "i={}; ffmpeg -i {} "\${i%.*}.mp4"
"