MP3 Süre için Toplu İş İçin FFmpeg


0

Bir MP3 listem var. Ekranda ve ayrıca bir dosyada, her satır için bir MP3 olduğunu ve süresinin bir göstergesi olduğunu görmek isterim. İşte kullanıyorum toplu iş dosyası:

@echo off

cls
if exist MP3Duration.txt del MP3Duration.txt

for %%i in (*.mp3) do (
  echo %%i
  echo %%i >> MP3Duration.txt
  ffmpeg -i "%%i" | find "Duration" >> MP3Duration.txt
)

Bunun birkaç sorunu var: çıktı dosyası dosya adları içeriyor, ancak süre içermiyor ve ekran görüntüsü çok fazla ffmpeg metni içeriyor ve her dosya için bir hata var: "En az bir çıktı dosyası belirtilmeli."

Yanıtlar:


1

ffmpegKonsol çıkışı yalnızca bilgilendirme amaçlıdır ve komut dosyasıyla ayrıştırılmamalıdır. ffprobeBunun yerine kullanın :

ffprobe -loglevel error -select_streams a -show_entries stream=duration -sexagesimal -of default=noprint_wrappers=1:nokey=1 "%%i" | TEE.BAT -a MP3Duration.txt

Ayrıca bkz. FFprobe Belgeleri ve FFmpeg Wiki: FFprobe İpuçları .


Bu yardımcı olur. Teşekkürler. Dahil etmek Düzeltme -sexagesimal( trac.ffmpeg.org/wiki/FFprobeTips istenen çıkış biçimi) ve Tee.bat ( robvanderwoude.com/unixports.php#TEE eşzamanlı ekran ve metin dosyası çıkışı için). Hala tek bir satırda dosya adı ve süresi alamıyor.
Ray Woodcock,

@RayWoodcock Ekran gereksinimini kaçırdım. Bir Windows kullanıcısı değil, ancak geçici bir çözümünüzü birleştirmek olabilir echove ffprobedaha sonra varsa tailveya eşdeğeri varsa son satırı ayrı ayrı okuyun : satırları boyunca bir şeyler echo "$i $(ffprobe -loglevel error -select_streams a -show_entries stream=duration -sexagesimal -of default=noprint_wrappers=1:nokey=1 "$i")" >> MP3Duration.txt; tail -n1 MP3Duration.txt.
lgan

0
rem this assumes ffmpeg is in c:\ffmpeg


if exist filelist.txt ( del /F filelist.txt )
if exist list.txt ( del /F list.txt )
copy nul list.txt >nul

rem change exts as needed for your audio files

    if exist *.mkv ( dir/b *.mkv >>list.txt )   
    if exist *.fl? ( dir/b *.fl? >>list.txt )   
    if exist *.avi ( dir/b *.avi >>list.txt )   
    if exist *.mp4 ( dir/b *.mp4 >>list.txt )   
    if exist *.mov ( dir/b *.mov >>list.txt )   
    if exist *.swf ( dir/b *.swf >>list.txt )

sort <list.txt >filelist.txt   


for /F "delims=;" %%F in ( filelist.txt ) do (
        for %%F in (^"%%F^") do (
            for /f "tokens=2-5 delims=:., " %%a in (
                'c:\ffmpeg\ffmpeg -i "%%F" 2^>^&1 ^| find "Duration:"'
            ) do (
                set /a full=%%a * 60 * 60 + %%b * 60 + %%c
            )
        )
        echo Length of %%F is %%a:%%b:%%c or !full! Seconds
)

1
Bu soruyu cevaplayabilse de, neden böyle olduğunu açıklayabilirseniz daha iyi bir cevap olabilir .
DavidPostill
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.