Risposte:
La risposta precedente creerà solo 1 file di output chiamato out.mov. Per creare un file di output separato per ogni vecchio film, prova questo.
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%.*}"`;
lavorerà sui nomi dei file con punti (e spazi) al loro interno.
.bat
in Windows?
Per Linux e macOS questo può essere fatto in una riga, usando l' espansione dei parametri per cambiare l'estensione del file di output:
for i in *.avi; do ffmpeg -i "$i" "${i%.*}.mp4"; done
ffmpeg
non è possibile immettere e output sullo stesso file. 2) Non sono sicuro che i comandi Bash funzionino in modo nativo su Windows 10. Forse dovrei aggiungere alla risposta che è indirizzato a sistemi che possono usare nativamente Bash come Linux e macOS. lxs ha fornito una risposta di Windows per questa domanda.
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
E su 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"
Uno script bash di una riga sarebbe facile da fare - sostituire *.avi
con il tipo di file:
for i in *.avi; do ffmpeg -i "$i" -qscale 0 "$(basename "$i" .avi)".mov ; done
-qscale
. Rimuoverlo e utilizzare le impostazioni predefinite o utilizzare -crf
invece (impostazione predefinita è -crf 23
).
basename
backtick non è quotata. Questo è esattamente il motivo per cui bash ha invece l'espansione della shell: per i in * .avi; do ffmpeg -i "$ i" -qscale 0 "$ (basename" $ i ".avi)". mov; fatto
Per convertire con le sottodirectory utilizzare ad es
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 {} \;
Per Windows:
Qui sto convertendo tutti i file (.mp4) in file (.mp3).
Apri cmd, vai alla cartella desiderata e digita il comando.
Scorciatoia: (facoltativo)
1. Andare alla cartella in cui sono presenti i file (.mp4)
2. Premere Maiusc e fare clic con il pulsante sinistro del mouse e scegliere "Apri finestra PowerShell qui"
o "Apri finestra prompt dei comandi qui"
3. Digitare "cmd" [NOTA : Saltare questo passaggio se apre direttamente cmd anziché PowerShell]
4. Eseguire il comando
for %i in (*.mp4) do ffmpeg -i "%i" "%~ni.mp3"
Se vuoi metterlo in un file batch su Windows 10, devi usare %% i.
Per chiunque voglia convertire in batch qualsiasi cosa con ffmpeg ma vorrebbe avere una comoda interfaccia di Windows, ho sviluppato questo front-end:
https://sourceforge.net/projects/ffmpeg-batch
Aggiunge a ffmpeg un'interfaccia di moda per finestre, barre di avanzamento e informazioni sul tempo rimanente, caratteristiche che mi mancavano sempre quando si utilizzava ffmpeg.
Se hai GNU parallelo, puoi convertire tutti i file .avi sottostanti vid_dir
in mp4 in parallelo, usando tutti tranne uno dei tuoi core CPU con
find vid_dir -type f -name '*.avi' -not -empty -print0 |
parallel -0 -j -1 ffmpeg -loglevel fatal -i {} {.}.mp4
Per convertire da / in diversi formati, modificare '*.avi'
o .mp4
secondo necessità. Il parallelo GNU è elencato nella maggior parte dei repository di distribuzioni Linux in un pacchetto che di solito viene chiamato parallel
.
!
alla fine di una delle battute bash?
So che potrebbe essere ridondante, ma uso questo script per convertire in batch i file.
old_extension=$1
new_extension=$2
for i in *."$old_extension";
do ffmpeg -i "$i" "${i%.*}.$new_extension";
done
Sono necessari 2 argomenti per renderlo più flessibile:
Creo un alias per questo ma puoi anche usarlo manualmente in questo modo:
sh batch_convert.sh mkv mp4
Ciò convertirà tutti i mkv
file in mp4
file.
Come puoi vedere leggermente più versatile. Finché è ffmpeg
possibile convertirlo, è possibile specificare due estensioni.
Ottenere un po 'come il golf del codice qui, ma poiché quasi tutte le risposte finora sono bash (escluso uno solo cmd uno), ecco un comando multipiattaforma di Windows che utilizza PowerShell (perché fantastico):
ls *.avi|%{ ffmpeg -i $_ <ffmpeg options here> $_.name.replace($_.extension, ".mp4")}
Puoi cambiare * .avi in qualsiasi corrispondenza con il filmato sorgente.
Naturalmente, ora PowerShell è arrivato, progettato appositamente per rendere qualcosa di esattamente così estremamente facile.
E, sì, PowerShell è disponibile anche su altri sistemi operativi diversi da Windows, ma è preinstallato su Windows, quindi questo dovrebbe essere utile a tutti.
Innanzitutto, ti consigliamo di elencare tutti i file nella directory corrente, quindi inizieremo con:
ls
Puoi anche usarlo ls -Recurse
se vuoi convertire ricorsivamente anche tutti i file nelle sottodirectory.
Quindi, filtreremo quelli fino al solo tipo di file che vogliamo convertire, ad esempio "avi".
ls | Where { $_.Extension -eq ".avi" }
Successivamente, passeremo tali informazioni a FFmpeg tramite a ForEach
.
Per l'input di FFmpeg, useremo il FullName
- questo è l'intero percorso del file. E per l'output di FFmpeg useremo il Name
- ma sostituendo il .avi
alla fine con .mp3
. Quindi, sarà simile a questo:
$_.Name.Replace(".avi", ".mp3")
Quindi, mettiamo tutto insieme e questo è il risultato:
ls | Where { $_.Extension -eq ".avi" } | ForEach { ffmpeg -i $_.FullName $_.Name.Replace(".avi", ".mp3") }
Che convertirà tutti i file ".avi" in file ".mp3" tramite FFmpeg, basta sostituire le tre cose tra virgolette per decidere quale tipo di conversione desideri e sentirti libero di aggiungere qualsiasi altro argomento a FFmpeg all'interno di ForEach
.
Puoi fare un ulteriore passo avanti e aggiungere Remove-Item
alla fine per eliminare automaticamente i vecchi file.
Se ffmpeg
non è nel tuo percorso, ed è effettivamente nella directory in cui ti trovi attualmente, scrivi ./ffmpeg
lì invece che semplicemente ffmpeg
.
Spero che questo aiuti chiunque.
.ps1
file, non in un .bat
file. Dovrai eseguire Set-ExecutionPolicy RemoteSigned
come amministratore se non hai mai eseguito uno script PS prima.
finestre:
@echo off
for /r %%d in (*.wav) do (
ffmpeg -i "%%~nd%%~xd" -codec:a libmp3lame -c:v copy -qscale:a 2 "%
%~nd.2.mp3"
)
questo è un bitrate variabile di qualità 2, puoi impostarlo su 0 se vuoi, ma a meno che tu non abbia un sistema di altoparlanti davvero buono è inutile imo
Se si desidera che un'interfaccia grafica elabori in batch con ffmpegX, provare Quick Batcher . È gratuito e prenderà le tue ultime impostazioni di ffmpegX per convertire i file che ci cadi dentro.
Si noti che non è possibile trascinare le cartelle su Quick Batcher. Quindi seleziona i file e poi inseriscili in Quick Batcher.
Solo questo ha funzionato per me, per favore nota che devi creare manualmente la cartella "newfiles" dove si trova il file ffmpeg.exe.
Converti . file nel codice audio .wav:
for %%a in ("*.*") do ffmpeg.exe -i "%%a" "newfiles\%%~na.wav"
pause
cioè se vuoi convertire tutti i file .mp3 in .wav cambiare ("*.*")
in ("*.mp3")
.
L'autore di questo script è:
https://forum.videohelp.com/threads/356314-How-to-batch-convert-multiplex-any-files-with-ffmpeg
spero che abbia aiutato 🙏.
Questo creerà video mp4 da tutti i file jpg dalla directory corrente.
echo exec("ffmpeg -framerate 1/5 -i photo%d.jpg -r 25 -pix_fmt yuv420p output.mp4");
E per Windows, questo non funziona
FOR /F "tokens=*" %G IN ('dir /b *.flac') DO ffmpeg -i "%G" -acodec mp3 "%~nG.mp3"
anche se faccio il doppio di quelli %
.
Vorrei anche suggerire:
-acodec ***libmp3lame***
anche:
FOR /F "tokens=*" %G IN ('dir /b *.flac') DO ffmpeg -i "%G" -acodec libmp3lame "%~nG.mp3"
Questo è quello che uso per convertire in batch avi in 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"
Funziona bene come file cmd, eseguilo, il ciclo trova tutti i file avi in quella cartella.
chiama MY (cambia per il tuo) ffmpeg, passa il nome di input, le impostazioni sono per riscalare con la nitidezza. I probi non hanno bisogno di CRF e " -b:v 1024k
" ...
Il file di output è il file di input meno l'estensione, con mp4 come nuovo ext.
Sto usando questo one-liner in Linux per convertire i file (di solito H265) in qualcosa che posso giocare su Kodi senza problemi:
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
Questo converte in un file temporaneo e quindi sostituisce l'originale in modo che i nomi rimangano gli stessi dopo la conversione.
Anche se vuoi la stessa conversione nelle sottocartelle. ecco il codice ricorsivo.
for /R "folder_path" %%f in (*.mov,*.mxf,*.mkv,*.webm) do (
ffmpeg.exe -i "%%~f" "%%~f.mp4"
)
piccolo script php per farlo:
#!/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()
, e funziona sia su Windows che su Linux. sono d'accordo che è un caso limite però.
Un'altra soluzione semplice che non è stata ancora suggerita sarebbe quella di utilizzare xargs
:
ls *.avi | xargs -i -n1 ffmpeg -i {} "{}.mp4"
Un piccolo inconveniente è la scomoda denominazione dei file di output (ad es input.avi.mp4
.). Una possibile soluzione al problema potrebbe essere:
ls *.avi | xargs -i -n1 bash -c "i={}; ffmpeg -i {} "\${i%.*}.mp4"
"