ffmpeg로 전체 디렉토리를 어떻게 변환합니까?


190

명령 줄 또는 배치 스크립트를 통해 ffmpeg를 사용하여 전체 디렉토리 / 폴더를 어떻게 변환합니까?

답변:


174

이전 답변은 out.mov라는 하나의 출력 파일 만 만듭니다. 오래된 영화마다 별도의 출력 파일을 만들려면 다음을 시도하십시오.

for i in *.avi;
  do name=`echo "$i" | cut -d'.' -f1`
  echo "$name"
  ffmpeg -i "$i" "${name}.mov"
done

24
나처럼 파일 이름에 공백이 많고 문제가있는 문자가 많으면 큰 따옴표를 추가하는 것이 좋습니다. ffmpeg -i "$ i" "$ name.mov";
Pif

7
오류가 발생했습니다i was unexpected at this time.
Keavon

5
do name=`echo "${i%.*}"`;점과 공백이있는 파일 이름에서 작동합니다.
Nepoxx

8
와우,이 대답은 엄청나게 복잡합니다. 한 줄 답변 중 하나를 참조하십시오.
foobarbecue

2
이 기능이 .batWindows에서 지원 됩니까?
Jazuly

294

들어 리눅스맥 OS 이 사용하여 한 줄에서 수행 할 수 매개 변수 확장을 출력 파일의 파일 이름 확장자를 변경하려면 :

for i in *.avi; do ffmpeg -i "$i" "${i%.*}.mp4"; done

2
이것은 완벽합니다, 감사합니다! 나를 위해 잘 작동하게 된 전체 명령은 다음과 같습니다. for i in * .avi; ffmpeg -i "$ i"-c : a aac -b : a 128k -c : v libx264 -crf 20 "$ {i % .avi} .mp4"; 완료
Phil Kulak

1
@Junaid 1) ffmpeg동일한 파일로 입력 및 출력 할 수 없으므로 입력 파일과 다른 이름을 입력 파일이나 다른 디렉토리로 출력해야합니다. 2) Bash 명령이 Windows 10에서 기본적으로 작동하는지 확실하지 않습니다. 아마도 Linux 및 macOS와 같이 Bash를 기본적으로 사용할 수있는 시스템을 대상으로한다는 답변에 추가해야 할 수도 있습니다. lxs는이 질문에 대한 Windows 답변을 제공했습니다.
llogan

4
멋진 답변입니다. 공백이있는 파일 이름에서도 작동합니다!
wisbucky 2012 년

1
이것이 최고의 답변이되어야합니다. 물론 {$ i %. *}에 대한 설명이 간단하지는 않지만,이를 제쳐두고 "사용"하면 신속하게 수정할 수 있습니다. 예를 들어, 다음을 사용하여 수백 개의 .mp4 (공백과 특수 문자가있는 파일 이름 포함)를 더 작은 형식으로 변환했습니다. for i in .mp4; ffmpeg -i "$ i"-s 512x288 -c : 사본 "$ {i %. } .m4v"; 완료
Tony M

1
한 걸음 더 나아가려면 일반적인 사용 사례 인 H.265에서 H.264로 코드 변환하는 경우 문자열 "x265"를 "x264"로 바꾸려면 Bash 매개 변수 대체를 사용할 수 있습니다 . 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
트래비스 런 야드

70

그리고 Windows에서 :

FOR /F "tokens=*" %G IN ('dir /b *.flac') DO ffmpeg -i "%G" -acodec mp3 "%~nG.mp3"

19
당신이 배치 파일 (.bat)에서이 명령을 실행하면 당신은 % 기호 => %% 두 배로 필요
hB0

이 명령을 실행하지만 원본 파일의 메타 데이터가 포함 된 새 파일로 복사하는 방법에 대한 아이디어가 있습니까?
Barryman9000

@ Barryman9000 이것은 오래 전의 일이지만 통과 할 수있는 출력 파일 옵션이 있다고 생각합니다.
lxs

@lxs 후속 조치에 감사드립니다. 새 파일의 이름을 원래 파일의 날짜로 변경하여 Powershell로 작업을 마쳤습니다. stackoverflow.com/a/35671099/197472
Barryman9000

메타 데이터를 제거하는 데 사용했습니다. 그러나 액세스 거부 오류가 발생했습니다. 그래서 출력 파일 이름을 여분의 공간으로 변경하여 새 파일로 만들었습니다. FOR /F "tokens=*" %G IN ('dir /b *.mp3') DO ffmpeg -i "%G" -map_metadata -1 -c:v copy -c:a copy "%~nG .mp3"
Junaid

28

한 줄짜리 bash 스크립트는 쉽게 할 수 있습니다- *.avi파일 형식으로 바꾸 십시오.

for i in *.avi; do ffmpeg -i "$i" -qscale 0 "$(basename "$i" .avi)".mov  ; done

.mov의 기본 인코더는 libx264 (사용 가능한 경우)이지만이 인코더는 무시합니다 -qscale. 그것을 제거하고 기본 설정을 사용하거나 -crf대신 사용하십시오 (기본값은 -crf 23).
llogan

1
파일 이름에 공백이 있으면 역행 된 basename서브 쉘이 인용 되지 않기 때문에 명령이 실패합니다 . 이것이 바로 bash가 대신 쉘 확장을 갖는 이유입니다. for i in * .avi; ffmpeg -i "$ i"-qscale 0 "$ (기본 이름"$ i ".avi)". mov; 완료
Calimo

@Calimo 덕분에 전적으로 동의합니다-나는 대답을 업데이트했습니다
yolk

22

하위 디렉토리로 변환하려면 다음을 사용하십시오.

find . -exec ffmpeg -i {} {}.mp3 \;

VTT를 SRT로 변환하기 위해이 답변 과 함께 이것을 사용 하여 큰 효과를 얻었습니다. find -name "*.vtt" -exec ffmpeg -i {} {}.srt \;
grooveplex

이 명령은 모든 mp4를 mp3로 변환하기 위해 약간의 수정이 있습니다 :find *.mp4 -exec ffmpeg -i {} {}.mp3 \;
swdev

1
또는 여러 파일 형식을 변환하려면 다음을 수행하십시오.find . -name *.ogg -or -name *.wma -exec ffmpeg -i {} {}.mp3 \;
bonh

모든 wma 파일을 mp3로 변환하고 삭제 한 후 :find . -name *.wma -exec ffmpeg -i {} {}.mp3 \; -exec rm {} \;
Panagiotis

20

Windows의 경우 :

여기에서 모든 (.mp4) 파일을 (.mp3) 파일로 변환합니다.
cmd를 열고 원하는 폴더로 이동 한 후 명령을 입력하십시오.

바로 가기 : (선택 사항)
1. (.mp4) 파일이있는 폴더로 이동합니다
. 2. Shift 키를 누른 상태에서 마우스 왼쪽 버튼을 클릭하고 "여기에서 PowerShell 창 열기"
또는 "여기에서 명령 프롬프트 창 열기 "를 선택합니다.
3. "cmd"를 입력합니다. [참고 : PowerShell 대신 cmd를 직접 여는 경우이 단계를 건너 뛰십시오]
4. 명령을 실행하십시오.

for %i in (*.mp4) do ffmpeg -i "%i" "%~ni.mp3"

이 파일을 Windows 10의 배치 파일에 넣으려면 %% i를 사용해야합니다.


18

ffmpeg로 무언가를 일괄 변환하고 싶지만 편리한 Windows 인터페이스를 갖고 싶은 사람을 위해이 프론트 엔드를 개발했습니다.

https://sourceforge.net/projects/ffmpeg-batch

그것은 ffmpeg에 창 패션 인터페이스, 진행률 표시 줄 및 남은 시간 정보, ffmpeg를 사용할 때 항상 놓친 기능을 추가합니다.


좋아, 이것은 좋은 프로젝트입니다! 나는 ffmpeg가 Windows에서 상대 파일 경로를 받아들이려고 시도하는 동안 한 시간 동안 내 꼬리를 쫓아 왔으며 이것이 속임수처럼 느껴집니다. 편집 : 나는 인 .flac에 .xwm 변환이 사용
semtex41

6

GNU 병렬vid_dir사용하는 경우 CPU 코어 중 하나를 제외한 모든 .avi 파일 을 mp4로 병렬 변환 할 수 있습니다.

find vid_dir -type f -name '*.avi' -not -empty -print0 |
    parallel -0 -j -1 ffmpeg -loglevel fatal -i {} {.}.mp4

다른 형식으로 변환 '*.avi'하거나 다른 형식으로 변환하려면 또는 .mp4필요에 따라 변경하십시오 . GNU Parallel은 대부분의 Linux 배포판 리포지토리에 일반적으로라는 패키지로 표시됩니다 parallel.


!배쉬 원 라이너의 끝에 추가하여 동일한 작업을 수행 할 수 없습니까?
stib

3

중복 될 수 있음을 알고 있지만이 스크립트를 사용하여 파일을 일괄 변환합니다.

old_extension=$1
new_extension=$2

for i in *."$old_extension";
  do ffmpeg -i "$i" "${i%.*}.$new_extension";
done

유연성을 높이려면 두 가지 주장이 필요합니다.

  1. 변환하려는 확장자
  2. 변환하려는 새 확장

별칭을 만들지 만 다음과 같이 수동으로 사용할 수도 있습니다.

sh batch_convert.sh mkv mp4

모든 mkv파일을 mp4파일 로 변환 합니다.

보시다시피 약간 더 다목적입니다. 긴로 ffmpeg변환 할 수 있습니다 당신은 어떤 두 개의 확장을 지정할 수 있습니다.


그게 최고예요
Andreas Prang

3

여기에 코드 골프와 같은 것이 있지만 지금까지 거의 모든 대답은 bash (하나의 외로운 cmd 명령 제외) 이므로 powershell을 사용 하는 Windows 플랫폼 간 명령이 있습니다 (굉장하기 때문에).

ls *.avi|%{ ffmpeg -i $_ <ffmpeg options here> $_.name.replace($_.extension, ".mp4")}

* .avi를 소스 푸티 지와 일치하는 것으로 변경할 수 있습니다.


3

물론 PowerShell이 등장했습니다 . 특히 이와 같은 것을 매우 쉽게 만들 수 있도록 특별히 설계되었습니다 .

예, PowerShell은 Windows 이외의 다른 운영 체제 에서도 사용할 수 있지만 Windows에는 사전 설치되어 있으므로 모든 사람에게 유용합니다.

먼저, 현재 디렉토리 내의 모든 파일을 나열하고 싶으므로 다음으로 시작하겠습니다.

ls

ls -Recurse하위 디렉토리의 모든 파일을 재귀 적으로 변환하려는 경우 에도 사용할 수 있습니다 .

그런 다음 변환하려는 파일 형식 (예 : "avi")으로 만 필터링합니다.

ls | Where { $_.Extension -eq ".avi" }

그 후에는을 통해 해당 정보를 FFmpeg로 전달합니다 ForEach.

FFmpeg의 입력 FullName에는 파일의 전체 경로 인-를 사용 합니다. 그리고는 FFmpeg의 출력을 위해 우리는을 사용합니다 Name-하지만 교체.avi가진 끝 .mp3. 따라서 다음과 같이 보일 것입니다.

$_.Name.Replace(".avi", ".mp3")

자,이 모든 것을 하나로 합치 자 결과는 다음과 같습니다.

ls | Where { $_.Extension -eq ".avi" } | ForEach { ffmpeg -i $_.FullName $_.Name.Replace(".avi", ".mp3") }

그러면 FFmpeg를 통해 모든 ".avi"파일을 ".mp3"파일로 변환하고 따옴표로 묶은 세 가지 항목을 바꾸어 원하는 변환 유형을 결정하고 다른 인수를 FFmpeg에 추가하십시오 ForEach.

한 단계 더 나아가 Remove-Item마지막에 추가 하여 이전 파일을 자동으로 삭제할 수 있습니다.

경우 ffmpeg경로에 있지이며, 쓰기, 당신이 현재하고있는 디렉토리에 실제로의 ./ffmpeg가 대신의 ffmpeg.

이것이 누군가를 돕기를 바랍니다.


1
PowerShell은 훌륭합니다! 다른 사람이 이것을 실행하는 데 문제가있는 경우 :이 명령을 .ps1파일이 아닌 파일 에 넣으십시오 .bat. Set-ExecutionPolicy RemoteSigned이전에 PS 스크립트를 실행 한 적이 없다면 관리자 권한으로 실행 해야합니다.
일시 중지

글쎄, 일반적으로 PowerShell에서 바로 실행하는 것에 대해 생각했기 때문에 실제로는 생각하지 않았습니다! 그래도 좋은 팁!
ABPerson

2
for i in *.flac;
  do name=`echo "${i%.*}"`;
  echo $name;
  ffmpeg -i "${i}" -ab 320k -map_metadata 0 -id3v2_version 3 "${name}".mp3;
done

[1] [2]를 사용하여 프로세스 flac파일을 일괄 처리 mp3(공백이있는 파일 이름에 안전)


2

창문 :

@echo off
for /r %%d in (*.wav) do (
    ffmpeg -i "%%~nd%%~xd" -codec:a libmp3lame -c:v copy -qscale:a 2 "%

%~nd.2.mp3"
)

이것은 품질 2의 가변 비트 레이트입니다. 원하는 경우 0으로 설정할 수 있지만 실제로 훌륭한 스피커 시스템이 없으면 쓸모가 없습니다.


1

당신이 원하는 경우 ffmpegX와 일괄 처리에 그래픽 인터페이스를 시도 빠른 고점을 . 무료이며 마지막 ffmpegX 설정을 사용하여 드롭 한 파일을 변환합니다.

폴더를 Quick Batcher로 끌어 놓을 수는 없습니다. 따라서 파일을 선택한 다음 Quick Batcher를 통해 넣으십시오.


2
"빠른 고점"소프트웨어는 Mac OS입니다
모하마드 ElNesr

1

이 중 하나만 나를 위해 일했습니다. pls는 ffmpeg.exe 파일이있는 곳에서 "newfiles"폴더를 수동으로 만들어야한다는 것을 알았습니다.

변환 합니다. 파일을 .wav 오디오 코드로 :

for %%a in ("*.*") do ffmpeg.exe -i "%%a" "newfiles\%%~na.wav"
pause

즉, 모든 .mp3 파일을 .wav로 변환하려면로 변경 ("*.*")하십시오 ("*.mp3").

이 스크립트의 저자는 다음과 같습니다

https://forum.videohelp.com/threads/356314-How-to-batch-convert-multiplex-any-files-with-ffmpeg

그것이 도움이되기를 바랍니다.


0

현재 디렉토리의 모든 jpg 파일에서 mp4 비디오가 생성됩니다.

echo exec("ffmpeg -framerate 1/5 -i photo%d.jpg -r 25 -pix_fmt yuv420p output.mp4");

0

그리고 Windows의 경우 작동하지 않습니다

FOR /F "tokens=*" %G IN ('dir /b *.flac') DO ffmpeg -i "%G" -acodec mp3 "%~nG.mp3"

내가 두 배로해도 %.

나는 심지어 제안 할 것이다 :

-acodec ***libmp3lame***

또한:

FOR /F "tokens=*" %G IN ('dir /b *.flac') DO ffmpeg -i "%G" -acodec libmp3lame "%~nG.mp3"

이것은 답변입니까, 아니면 새로운 질문을 답변으로 게시하려는 시도입니까? 후자의 경우 배경으로 여기에 다시 연결될 수 있지만 완전히 새로운 질문을 작성하십시오.
트리플 리

0

이것은 AVI를 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"

cmd 파일로 잘 작동하고 실행하면 루프가 해당 폴더의 모든 avi 파일을 찾습니다.

FFmpeg MY (전화 번호 변경)를 호출하고 입력 이름을 전달하면 선명하게 설정이 다시 조정됩니다. 나는 CRF와 " -b:v 1024k" 가 필요하지 않습니다 .

출력 파일은 입력 파일에서 확장자를 뺀 값이며 mp4는 새로운 확장자입니다.


0

Linux 에서이 단일 라이너를 사용하여 파일 (일반적으로 H265)을 문제없이 Kodi에서 재생할 수있는 것으로 변환합니다.

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

이렇게하면 임시 파일로 변환 된 다음 원본이 바뀌어 변환 후에도 이름이 동일하게 유지됩니다.


0

또한 하위 폴더에서 동일한 변환을 원할 경우. 재귀 코드는 다음과 같습니다.

for /R "folder_path" %%f in (*.mov,*.mxf,*.mkv,*.webm) do (
    ffmpeg.exe -i "%%~f" "%%~f.mp4"
    )

-1

그것을하는 작은 PHP 스크립트 :

#!/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' ) );
}

2
사용자가 자신의 컴퓨터에 PHP를 설치해야하므로 매우 제한된 범위의 대답입니다. 명령 행 및 배치 파일 응답이 훨씬 쉽고 복잡하지 않습니다.
ProfK

2
@ProfK PHP는 SO에서 가장 널리 사용되는 언어 중 하나입니다. 둘째, sh에 대한 Isaac의 대답은 파일의 이름을 원본과 다른 이름으로 바꿀 수 있다는 점에서 다소 신뢰할 수 없습니다. lyx의 bat 스크립트는 더 나쁩니다 . 이름에 줄 바꿈이있는 파일은 완전히 무시 합니다. 왜 구문 오류 또는 다른 것이 아닌지 확실하지 않지만 (win10에서 테스트 됨). 내 PHP 스크립트는 덕분에 문제가 없으며 escapeshellarg()Windows와 Linux 모두에서 작동합니다. 그래도 가장자리에 동의합니다.
hanshenrik

-1

아직 제안되지 않은 또 다른 간단한 해결책은 다음을 사용하는 것입니다 xargs.

ls *.avi | xargs -i -n1 ffmpeg -i {} "{}.mp4"

하나의 사소한 함정은 출력 파일의 어색한 이름입니다 (예 :) input.avi.mp4. 이에 대한 가능한 해결 방법은 다음과 같습니다.

ls *.avi | xargs -i -n1 bash -c "i={}; ffmpeg -i {} "\${i%.*}.mp4""


shellcheck.net 은 예제와 관련하여 몇 가지 제안 사항이 있습니다.
llogan

mywiki.wooledge.org/ParsingLs 당신 생각은 간단하게 교체 할 수 있습니다 lsprintf '%s\n'여기에.
tripleee
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.