随着版权意识增强,网易云音乐现在下载后是 .ncm 格式的文件,默认只能在电脑上使用网易云音乐打开,我们如何在其他设备,比如汽车上播放呢?
这就需要两步处理:
.ncm从 Release 下载最新版本的对应系统的已编译好的二进制文件
使用 -h 或 --help 参数来打印帮助
ncmdump -h处理单个或多个文件
ncmdump 1.ncm 2.ncm...使用 -d 参数来指定一个文件夹,对文件夹下的所有以 ncm 为扩展名的文件进行批量处理
ncmdump -d source_dir使用 -r 配合 -d 参数来递归处理文件夹下的所有以 ncm 为扩展名的文件
ncmdump -d source_dir -r使用 -m 参数来删除源文件若正确处理
ncmdump -m使用 -o 参数来指定输出目录,将转换后的文件输出到指定目录,该参数支持与 -r 参数一起使用
# 处理单个或多个文件并输出到指定目录
ncmdump 1.ncm 2.ncm -o output_dir
# 处理文件夹下的所有以 ncm 为扩展名并输出到指定目录,不包含子文件夹
ncmdump -d source_dir -o output_dir
# 递归处理文件夹并输出到指定目录,并保留目录结构
ncmdump -d source_dir -o output_dir -r为方便使用,在 Windows 上可以将上述命令做成一个批处理命令,将文件或者文件夹拖到上面即可自动处理:
@echo off
chcp 65001 >nul
REM 注意:这里不要一开始就 EnableDelayedExpansion
setlocal
REM ===============================
REM 输出目录
REM ===============================
set "OUT_DIR=%~dp0output"
if not exist "%OUT_DIR%" mkdir "%OUT_DIR%"
REM ===============================
REM 参数检查
REM ===============================
if "%~1"=="" (
echo 请将 ncm 文件或文件夹拖拽到本 bat 文件上。
pause
exit /b
)
REM ===============================
REM 临时列表文件
REM ===============================
set "LIST_FILE=%TEMP%\ncm_list_%RANDOM%.txt"
> "%LIST_FILE%" echo.
REM ===============================
REM 收集 ncm 文件(此阶段不需要延迟展开)
REM ===============================
:COLLECT_LOOP
if "%~1"=="" goto COLLECT_DONE
if exist "%~1\" (
for /r "%~1" %%F in (*.ncm) do echo %%F>>"%LIST_FILE%"
) else (
if /i "%~x1"==".ncm" echo %~1>>"%LIST_FILE%"
)
shift
goto COLLECT_LOOP
:COLLECT_DONE
REM ===============================
REM 统计总数
REM ===============================
set TOTAL=0
for /f "usebackq delims=" %%F in ("%LIST_FILE%") do (
if not "%%F"=="" set /a TOTAL+=1
)
if %TOTAL%==0 (
echo 未找到任何 ncm 文件。
del "%LIST_FILE%" >nul 2>&1
pause
exit /b
)
echo 共找到 %TOTAL% 个 ncm 文件。
echo 输出目录:%OUT_DIR%
echo.
REM ===============================
REM 初始化计数器
REM ===============================
set INDEX=0
set SUCCESS=0
set FAILED=0
REM ===============================
REM 正式处理(关键:这里也不要延迟展开)
REM ===============================
for /f "usebackq delims=" %%F in ("%LIST_FILE%") do (
if not "%%F"=="" (
set /a INDEX+=1
call :DUMP_ONE "%%F"
)
)
del "%LIST_FILE%" >nul 2>&1
echo ==================================
echo 处理完成
echo 总数 :%TOTAL%
echo 成功 :%SUCCESS%
echo 失败 :%FAILED%
echo 输出目录:%OUT_DIR%
echo ==================================
pause
exit /b
REM ===============================
REM 单文件处理(这里才开启延迟展开)
REM ===============================
:DUMP_ONE
setlocal EnableDelayedExpansion
set "SRC=%~1"
echo [%INDEX%/%TOTAL%] 正在处理:
echo %SRC%
ncmdump "%SRC%" -o "%OUT_DIR%" >nul 2>&1
if !errorlevel! equ 0 (
endlocal & set /a SUCCESS+=1
echo 处理成功
) else (
endlocal & set /a FAILED+=1
echo 处理失败
)
echo.
exit /b.mp3从官方构建网站下载 FFmpeg,点击 ffmpeg-release-full.7z 或 ffmpeg-release-full.zip 链接下载。
将下载的压缩包解压到一个你方便找到的目录,例如 D:\ffmpeg。解压后,进入 bin 文件夹,会看到三个可执行文件:ffmpeg.exe, ffprobe.exe, ffplay.exe。可以将 FFmpeg 添加到系统环境变量(关键步骤,便于在任何地方使用),比如 D:\ffmpeg\bin 。
打开 CMD 或 PowerShell,导航到文件所在目录,或直接使用文件绝对路径。
基本命令(指定输出比特率为 320k)
ffmpeg -i "input.flac" -b:a 320k "output.mp3"使用绝对路径的示例
ffmpeg -i "D:\Music\FlacFiles\song.flac" -b:a 320k "D:\Music\Mp3Files\song.mp3"参数解释:
-i "input.flac":指定输入文件。
-b:a 320k:设置音频流的比特率为 320 kbps。这是保证 320kbps 质量的关键参数。
"output.mp3":指定输出文件名。
批量转换当前目录下的所有 FLAC 文件
# PowerShell 命令 (推荐)
Get-ChildItem *.flac | ForEach-Object { ffmpeg -i $_ -c:a libmp3lame -b:a 320k -c:v copy -map 0 -write_id3v2 1 -id3v2_version 3 ($_.BaseName + ".mp3") }
# 或者使用这个更通用的命令(CMD 和 PowerShell 都适用)
foreach ($file in Get-ChildItem *.flac) { ffmpeg -i $file.FullName -c:a libmp3lame -b:a 320k -c:v copy -map 0 -write_id3v2 1 -id3v2_version 3 ($file.BaseName + ".mp3") }如果是传统的 CMD 环境:
for %i in (*.flac) do ffmpeg -i "%i" -c:a libmp3lame -b:a 320k -c:v copy -map 0 -write_id3v2 1 -id3v2_version 3 "%~ni.mp3"解释:
%i 是文件名,%~ni 是去掉扩展名的文件名。这个循环会为每个 .flac 文件生成同名的 .mp3 文件。
-c:a libmp3lame:明确使用LAME MP3编码器(质量更好)。
-b:a 320k:指定输出 320kbps。
-c:v copy:视频/图片流直接复制,不重新编码,保持原格式(JPG还是JPG)。
-map 0:映射输入文件的所有流(音频、视频、字幕、附件等)。
-write_id3v2 1:强制写入ID3v2标签。
-id3v2_version 3:使用ID3v2.3格式,兼容性最好。
为方便使用,在 Windows 上可以将上述命令做成一个批处理命令,将文件或者文件夹拖到上面即可自动处理:
@echo off
chcp 65001 >nul
setlocal EnableDelayedExpansion
REM ===============================
REM 基础路径
REM ===============================
set "BAT_DIR=%~dp0"
set "OUT_DIR=%BAT_DIR%output_mp3"
if not exist "%OUT_DIR%" mkdir "%OUT_DIR%"
REM ===============================
REM 参数检查
REM ===============================
if "%~1"=="" (
echo 请将 FLAC 文件或文件夹拖拽到本 bat 文件上。
pause
exit /b
)
REM ===============================
REM 初始化计数器
REM ===============================
set TOTAL=0
set INDEX=0
set SUCCESS=0
set FAILED=0
REM ===============================
REM 第一遍:统计总数
REM ===============================
:COUNT_LOOP
if "%~1"=="" goto COUNT_DONE
if exist "%~1\" (
for /r "%~1" %%F in (*.flac) do set /a TOTAL+=1
) else (
if /i "%~x1"==".flac" set /a TOTAL+=1
)
shift
goto COUNT_LOOP
:COUNT_DONE
if %TOTAL%==0 (
echo 未找到任何 FLAC 文件。
pause
exit /b
)
echo 共找到 %TOTAL% 个 FLAC 文件。
echo.
REM ===============================
REM 重置参数(重新获取拖拽参数)
REM ===============================
set ARGS=%*
REM ===============================
REM 第二遍:开始转换
REM ===============================
call :PROCESS %ARGS%
goto END
:PROCESS
if "%~1"=="" exit /b
if exist "%~1\" (
for /r "%~1" %%F in (*.flac) do call :CONVERT "%%F"
) else (
if /i "%~x1"==".flac" call :CONVERT "%~1"
)
shift
goto PROCESS
REM ===============================
REM 单个文件转换
REM ===============================
:CONVERT
set /a INDEX+=1
set "SRC=%~1"
set "NAME=%~n1"
set "DEST=%OUT_DIR%\%NAME%.mp3"
REM ---- 重名处理 ----
set COUNT=1
:CHECK_NAME
if exist "%DEST%" (
set "DEST=%OUT_DIR%\%NAME%_(%COUNT%).mp3"
set /a COUNT+=1
goto CHECK_NAME
)
echo [%INDEX%/%TOTAL%] 正在转换:
echo %SRC%
ffmpeg -y ^
-i "%SRC%" ^
-map 0 ^
-c:a libmp3lame -b:a 320k ^
-c:v copy ^
-write_id3v2 1 -id3v2_version 3 ^
"%DEST%" >nul 2>&1
if !errorlevel! equ 0 (
set /a SUCCESS+=1
echo 转换成功
) else (
set /a FAILED+=1
echo 转换失败
)
echo.
exit /b
:END
echo ==================================
echo 转换完成
echo 总数 :%TOTAL%
echo 成功 :%SUCCESS%
echo 失败 :%FAILED%
echo 输出目录:%OUT_DIR%
echo ==================================
pause