有没有办法在 Windows 10 中根据媒体时长设置默认程序?例如,使用 Winamp 打开少于 20 秒的音频文件(.wav、.mp3 等),使用 MusicBee 打开其他文件。
答案1
虽然您无法根据媒体文件的持续时间更改默认应用程序关联,但您可以考虑探索几种可能性:
- 使用资源管理器中的“持续时间”列对媒体进行排序,然后根据持续时间手动创建每个媒体播放器的播放列表。
- 编写一个脚本,对您的媒体进行分类并根据持续时间创建播放列表。本文展示了元数据(包括持续时间)在脚本中的一些创新使用方法。
但是这两种方法都要求您在将新媒体添加到库中时更新播放列表。虽然这并非您所要求的,但我相信这是一个非常好的问题,可以产生许多富有创意的结果。祝您好运!
答案2
存档的唯一方法是:将格式更改.mp3
为.mp3l
.mp3s
MP3 长格式和 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。
我将非常感激。