近期開始使用ffmpeg之後真的越來越喜歡用命令列的形式來操作電腦了,命令列比起圖形介面的優勢無非就是快!,剛開始使用的時候真的覺得非常非常快,轉幾個檔案,甚至轉一整個資料夾的檔案都不是問題,但接下來隨著要轉的檔案越來越多,心中漸漸地浮現出了幾個問題。
1.批次轉檔的檔名設定
目前轉檔都是用batch檔丟個別資料夾,程式碼: for %%A IN (*.wmv) DO ffmpeg -i "%%A" "%%A.mp4" ,用這個方法轉檔後的確會生成同名稱的mp4檔,但生成後的mp4檔名稱會叫作 原檔名.wmv.mp4,有辦法在生成的時候就將.wmv刪除嗎?
2.批次轉檔後的檔案生成位置
繼承上個題目,可以統一執行指令的時候就生成資料夾並將轉檔完成的檔案放進去嗎?
3.批次轉檔的有效範圍
繼承問題一,在執行batch檔的時候通常只會轉換與.bat檔在同一個子資料夾的.wmv檔,有辦法讓父資料夾下所有子資料夾中的.wmv都轉檔嗎?
4.批次轉檔的速度
繼承問題一,目前學會batch轉檔後漸漸的就對這種命令列的速度上癮了,但是在同時執行5個資料夾內batch檔轉檔的情況下,轉檔了快4個多小時還沒有轉好,也促成我註冊帳號來版上問各位大大的動機,轉檔的總大小約35GB,5個.bat同時執行轉檔,檔案都在1TB的HDD中做轉檔,CPU為i5-6400 ,RAM是8GB在這種情況下這麼久的時間長是正常的嗎?
如果是正常的,請問同時執行5個.bat檔的速度比較快,還是排程讓5個.bat檔依序執行會比較快呢?
感謝各位大大的解惑!
evilin001 wrote:
for %%A IN (*.wmv) DO ffmpeg -i "%%A" "%%A.mp4"
2.批次轉檔後的檔案生成位置
繼承上個題目,可以統一執行指令的時候就生成資料夾並將轉檔完成的檔案放進去嗎?
mkdir ..\Soundless
for %%a IN (*.wmv) DO ffmpeg -i "%%a" "..\Soundless\%%~na".mp4
Soundless任意文件夾名
如果檔名有中文或日文+chcp 65001
chcp 65001
mkdir ..\Soundless
for %%a IN (*.wmv) DO ffmpeg -i "%%a" "..\Soundless\%%~na".mp4
https://www.mobile01.com/topicdetail.php?f=510&t=5591746&p=2
别被我選中..為何又選中..
evilin001 wrote:
1.批次轉檔的檔名設定
…生成後的mp4檔名稱會叫作 原檔名.wmv.mp4,有辦法在生成的時候就將.wmv刪除嗎?
2.批次轉檔後的檔案生成位置
…可以統一執行指令的時候就生成資料夾並將轉檔完成的檔案放進去嗎?
3.批次轉檔的有效範圍
…有辦法讓父資料夾下所有子資料夾中的.wmv都轉檔嗎?
(恕刪)
以下請自行修改,再試試!
Test.bat
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
set InputDir=D:\Your_Input_Dir
set OutputDir=D:\Your_Output_Dir
set VideoEncoder=G:\Your\ffmpeg\ffmpeg.exe
for /f "delims=" %%i in ('dir /b /s "!InputDir!\*.wmv"') do (
if not exist "!OutputDir!%%~pi" mkdir "!OutputDir!%%~pi"
"!VideoEncoder!" -i "%%i" "!OutputDir!%%~pni.mp4"
)
pause
這邊推薦一下 Windows 預設的現代化工具 PowerShell
可以直接使用 .net 的物件
例如 OpenFileDialog 在圖形介面選取檔案
對於習慣用滑鼠挑選多個檔案的人非常方便
還可以使用 sort-object 指令按規則排列檔案清單
第三行錯了要更正:
$SelectedFiles = Select-Files | ForEach-Object {Get-Item -LiteralPath $_} | sort-object -Property {
必須用 Get-Item 轉成 FileInfo 物件才有 BaseName 屬性可用
跟其他 .net 語言不同的是PowerShell 即使用了不存在屬性也不會出現錯誤,而是回傳 $null
另外 PowerShell 的指令要特別路徑參數的模式問題
-LiteralPath 參數防止輸入路徑中的中括號 [ ] 被當作萬用字元解釋
通常 -Path 是萬用字元模式,一般模式要使用 -LiteralPath
其他指令的另一種期況下 -Path 代表一般模式且沒有 -LiteralPath
另外,如果一定要 bat 檔的話,可以在bat 內呼叫 powersehl l執行腳本
-----------------------------------------------
@echo off
cd /d "%~dp0"
Powershell -ExecutionPolicy Bypass -File "%~dpn0.ps1" #後面可寫參數
pause
-----------------------------------------------
指定給 .ps1 腳本檔的無名參數會被儲存到腳本內的 $args 陣列
也可以使用有名參數例如 "-KeyName value" 必須在腳本開頭 param ( ... ) 內宣告