网易云音乐下载 NCM 文件后如何在其他设备上播放

老牛浏览 18评论 0发表于 更新于

问题说明

随着版权意识增强,网易云音乐现在下载后是 .ncm 格式的文件,默认只能在电脑上使用网易云音乐打开,我们如何在其他设备,比如汽车上播放呢?

这就需要两步处理:

  1. .ncm 文件还原为常规文件,常见的比如 .flac 格式,需要用到 ncmdump;

  2. .flac 转换格式为更通用的 .mp3 ,需要用到 FFmpeg

1. 处理 .ncm

Release 下载最新版本的对应系统的已编译好的二进制文件

使用 -h--help 参数来打印帮助

bash
ncmdump -h

处理单个或多个文件

bash
ncmdump 1.ncm 2.ncm...

使用 -d 参数来指定一个文件夹,对文件夹下的所有以 ncm 为扩展名的文件进行批量处理

bash
ncmdump -d source_dir

使用 -r 配合 -d 参数来递归处理文件夹下的所有以 ncm 为扩展名的文件

bash
ncmdump -d source_dir -r

使用 -m 参数来删除源文件若正确处理

bash
ncmdump -m

使用 -o 参数来指定输出目录,将转换后的文件输出到指定目录,该参数支持与 -r 参数一起使用

bash
# 处理单个或多个文件并输出到指定目录
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 上可以将上述命令做成一个批处理命令,将文件或者文件夹拖到上面即可自动处理:

bash
@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

2. 转换为 .mp3

官方构建网站下载 FFmpeg,点击 ffmpeg-release-full.7zffmpeg-release-full.zip 链接下载。

将下载的压缩包解压到一个你方便找到的目录,例如 D:\ffmpeg。解压后,进入 bin 文件夹,会看到三个可执行文件:ffmpeg.exe, ffprobe.exe, ffplay.exe。可以将 FFmpeg 添加到系统环境变量(关键步骤,便于在任何地方使用),比如 D:\ffmpeg\bin

打开 CMD 或 PowerShell,导航到文件所在目录,或直接使用文件绝对路径。

基本命令(指定输出比特率为 320k)

bash
ffmpeg -i "input.flac" -b:a 320k "output.mp3"

使用绝对路径的示例

bash
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 文件

bash
# 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 环境:

bash
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 上可以将上述命令做成一个批处理命令,将文件或者文件夹拖到上面即可自动处理:

bash
@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
点赞
收藏
暂无评论,快来发表评论吧~
私信
老牛@ilaoniu
老牛,俗称哞哞。单纯的九零后理工小青年。喜欢折腾,爱玩,爱音乐,爱游戏,爱电影,爱旅游...
最后活跃于