根据文件持续时间设置默认程序

根据文件持续时间设置默认程序

有没有办法在 Windows 10 中根据媒体时长设置默认程序?例如,使用 Winamp 打开少于 20 秒的音频文件(.wav、.mp3 等),使用 MusicBee 打开其他文件。

答案1

虽然您无法根据媒体文件的持续时间更改默认应用程序关联,但您可以考虑探索几种可能性:

  1. 使用资源管理器中的“持续时间”列对媒体进行排序,然后根据持续时间手动创建每个媒体播放器的播放列表。
  2. 编写一个脚本,对您的媒体进行分类并根据持续时间创建播放列表。本文展示了元数据(包括持续时间)在脚本中的一些创新使用方法。

但是这两种方法都要求您在将新媒体添加到库中时更新播放列表。虽然这并非您所要求的,但我相信这是一个非常好的问题,可以产生许多富有创意的结果。祝您好运!

答案2

存档的唯一方法是:将格式更改.mp3.mp3l .mp3sMP3 长格式和 MP3 短格式。然后您可以为每个文件扩展名分配自己的软件,这将解决您的问题。

这可以通过批处理和 ffprobe.exe 进行存档。您可以在 ffmpeg 编解码器工具中找到 ffprobe.exe。

只需读出每个持续时间,然后将文件结尾更改.mp3为单独的结尾。然后分配单独的程序来执行此操作。

我不会提供现成的代码,但我最近编写了一个功能强大的音乐转换工具,因此我可以为您提供有用的代码片段。但请仅将其用于私人用途。

@ECHO OFF
SETLOCAL EnableDelayedExpansion
cls


                REM ### Configuration ###

set LogEnabled=1&&      REM    1 = Save reports to log.txt  | 0 = Save no logfile
set ResetLog=1&&        REM    1 = Delete old log       | 0 = Continue in old log




                REM ### Initialisation ###


IF !LogEnabled! == 1 (
    ECHO Logging is enabled
) ELSE (
    ECHO Logging is disabled
)


set @InPath=%~dp0input\&&   REM defining input path
set @OutPath=%~dp0output\&& REM defining input path
set @RootPath=%~dp0&&       REM defining batch path
set @InDrive=%~d0\&&        REM defing current drive letter

SETLOCAL EnableDelayedExpansion
cd /D "%@InPath%\"

if !ResetLog! == 1 (
    del /F /Q "!@RootPath!log.txt"
)


set timestamp=!DATE:/=-!_!TIME::=-!
set timestamp=!timestamp: =!
set timestamp=!timestamp:-=:!
set timestamp=!timestamp:_= - !
IF !LogEnabled! == 1 (
    ECHO # !timestamp! # Starting conversion >>"%RootPath%..\log.txt"
)



                REM ### Read all listed audio files ###
for /F "usebackq tokens=*" %%Z in ("!@RootPath!aformats.cfg") do (
(
    for /r %%a in (*.%%Z) do (

set @InPath=%~dp0input\&&   REM defining input path
set @OutPath=%~dp0output\&& REM defining input path
set @RootPath=%~dp0&&       REM defining batch path
set @InDrive=%~d0\&&        REM defing current drive letter

SETLOCAL EnableDelayedExpansion


set FileLoc=%%~dpa%%~nxa

set FileLocRel=%%~dpa%%~nxa
set FileLocRel=!FileLocRel:%@InPath%=!

set OutLocRel=%%~dpa%%~nxa
set OutLocRel=!OutLocRel:%@InPath%=!
set OutLoc=%@RootPath%output\!OutLocRel!


for %%F in ("!FileLoc!") do (
    set FileName=%%~nxF
    set ShortFileName=%%~nF
    ECHO FILENAAAAAME: !ShortFileName!
    call set OutDir=%%OutLoc:!FileName!=%%
    call set OutLoc=%%OutLoc:!FileName!=%%!!ShortFileName!.mp3
)

ECHO Now processing: !FileLocRel!...
set timestamp=!DATE:/=-!_!TIME::=-!
set timestamp=!timestamp: =!
set timestamp=!timestamp:-=:!
set timestamp=!timestamp:_= - !
IF !LogEnabled! == 1 (
    ECHO # !timestamp! # Now processing: !FileLocRel!... >>"%RootPath%..\log.txt"
)



"%@RootPath%bin\ffprobe.exe" -i "!FileLoc!" -show_entries format=duration -v quiet -of csv="p=0" >>..\length.temp&&     REM reading length value into a temp file for later access

"%@RootPath%bin\ffprobe.exe" -i "!FileLoc!" -show_entries format=size -v quiet -of csv="p=0" >>..\size.temp&&       REM reading size value into a temp file for later access
            REM these are required to calculate the output bitrate


set length=0&&      REM Resetting length (in case of corrupted file)
set size=0&&        REM Resetting size (in case of corrupted file)

for /F "tokens=*" %%T in ('type "!@RootPath!length.temp"') do (
set length=%%T
)&&         REM Reading length from file as a value

for /F "tokens=*" %%S in ('type "!@RootPath!size.temp"') do (
set size=%%S
)&&         REM Reading size from file as a value


            REM Check, if detected file has size and duration - if not, is invalid

set SeemsInvalid=0
IF !size! GTR 0 (
    Echo donothing>>nul
) ELSE (
    set SeemsInvalid=1
)

IF !length! GTR 0 (
    Echo donothing>>nul
) ELSE (
    set SeemsInvalid=1
)

set timestamp=!DATE:/=-!_!TIME::=-!
set timestamp=!timestamp: =!
set timestamp=!timestamp:-=:!
set timestamp=!timestamp:_= - !
IF !SeemsInvalid! EQU 1 (
    Echo !FileLocRel! seems to be corrupted or invalid. Ignoring file...
    IF !LogEnabled! == 1 (
        Echo # !timestamp! # Error: !FileLocRel! seems to be corrupted or invalid. Ignoring file... >>"%RootPath%..\log.txt"
    )
)


        REM     Check if Output subdirectories exist. If not, create them.

IF EXIST "!OutDir!" (
    ECHO DONOTHING>>nul
) ELSE (
    MKDIR "!OutDir!"
)






IF !SeemsInvalid! == 0 (
    SET /A InBitrate=size*6
    SET /A InBitrate=InBitrate/length

    IF InBitrate GTR 320000 (
        set InBitrate=320000
    )


    set BitRate=128000
    set timestamp=!DATE:/=-!_!TIME::=-!
    set timestamp=!timestamp: =!
    set timestamp=!timestamp:-=:!
    set timestamp=!timestamp:_= - !
    ECHO # !timestamp! # "%@RootPath%bin\ffmpeg.exe" -n -i "!FileLoc!" -codec:a libmp3lame -b:a !InBitrate! -o "!OutLoc!" >>"%RootPath%..\log.txt"
    "%@RootPath%bin\ffmpeg.exe" -n -i "!FileLoc!" -codec:a libmp3lame -b:a !InBitrate! "!OutLoc!"
)




del /F /Q "!@RootPath!length.temp"&&        REM Cleaning up temp files for next loop
del /F /Q "!@RootPath!size.temp"&&      REM Cleaning up temp files for next loop
)
)
)

解释:该批处理文件与以下文件位于同一文件夹中:

  • 批处理文件
  • aformats.cfg(输入格式列表,例如:MP3 M4A WMA 等等。每行一个格式/文件结尾)
  • 输入(输入任何文件夹。这将重建相同的文件夹层次结构!!!所以不用担心复杂的文件夹树结构,它们保持不变)输出(这里所有文件也都使用与以前相同的文件夹结构进行编码 [仅 MP3])
  • bin\ffmpeg.exe(本例中所有 DLL 都打包到 exe 中)
  • bin\ffprobe.exe(本例中所有 DLL 都打包到 exe 中)

此代码只是将 aformats.cfg 中列出的每种格式重新编码为比特率略高的 MP3。目标比特率由持续时间和大小近似,两者都从 ffprobe.exe 读取

只需查看代码的这一部分,我是如何将其存档的。这可以很容易地重写,而不是重新编码文件,只需将 filename.mp3 重命名为 filename.mp3l,例如,如果它是长 MP3。您可以更改格式或其他任何内容。高度可定制。在读取大小和长度的行上方,还有一些我使用的代码,用于修改路径和文件名,需要根据您想要的用例进行更改。

请记住:此代码仅供私人使用。请尊重这需要大量工作(许多小时的测试、调试等)。

如果您理解的话,请告诉我如何做才能实现您的目标。

请记住:音乐播放器无法读取 filename.mp3l。因此,如果需要,您应该创建此批处理文件的副本并将其更改为相反的方式。将以下行添加到 aformats.cfg:

  • 韓式電腦
  • 響鳴韋
  • 无论您使用什么文件扩展名。

并且输出应该是 MP3,这是我这里的示例。只有您的幻想限制,您可以重写它来做什么。它还将一些基本内容记录到 log.txt 中,并带有时间戳。请记住:更改代码,不要对文件进行编码,而只是重命名它们。例如,我建议对 VLC 使用 MP3L,因为它不太在意文件扩展名 - 其他播放器可能会在意。您还可以使用 .mkv 或类似的扩展名,它支持 MP3 并且可以被许多标准程序读取。

这个工具非常强大!基本上,您可以将整个硬盘移到 \input 文件夹中,然后按下批处理文件。它会循环遍历所有内容!如果需要特殊字符,则需要更改 .bat 文件的字母编码。然后它将支持 Ä Ö Ü 等符号。我只是不喜欢一些垃圾 MP3。

我将非常感激。

相关内容