功能:将视频.mp4的音频流替换为音频.wav
主要适用于pcm音频流、avi封装的视频文件。
用法: 拖拽两个文件到本脚本上
或者在命令行中使用:
替换音频流.bat "视频.mp4" "音频.wav"
输出文件将自动生成在视频同目录下,文件名为: 原视频名_replace.avi
@echo off
chcp 65001 >nul
setlocal enabledelayedexpansion
title 视频音频替换工具
echo ================================
echo 视频音频替换工具
echo ================================
echo.
if "%~1"=="" goto noargs
if "%~2"=="" goto noargs
set "INPUT_VIDEO=%~1"
set "INPUT_AUDIO=%~2"
:: 自动生成输出文件名(在原视频同目录下)
for %%F in ("%INPUT_VIDEO%") do (
set "VIDEO_DIR=%%~dpF"
set "VIDEO_NAME=%%~nF"
set "OUTPUT_AVI=!VIDEO_DIR!!VIDEO_NAME!_replace.avi"
)
echo [信息] 输入视频: %INPUT_VIDEO%
echo [信息] 输入音频: %INPUT_AUDIO%
echo [信息] 输出文件: %OUTPUT_AVI%
echo.
:: 检查文件是否存在
if not exist "%INPUT_VIDEO%" (
echo 错误: 视频文件不存在!
pause
exit /b 1
)
if not exist "%INPUT_AUDIO%" (
echo 错误: 音频文件不存在!
pause
exit /b 1
)
:: 检查FFmpeg是否安装
where ffmpeg >nul 2>nul
if errorlevel 1 (
echo 错误: 未找到FFmpeg,请先安装FFmpeg
echo 下载地址: https://ffmpeg.org/download.html
pause
exit /b 1
)
:: 获取视频信息
for /f "delims=" %%a in ('ffprobe -v error -select_streams v:0 -show_entries stream^=codec_name -of default^=noprint_wrappers^=1:nokey^=1 "%INPUT_VIDEO%" 2^>^&1') do set "VIDEO_CODEC=%%a"
for /f "delims=" %%a in ('ffprobe -v error -select_streams v:0 -show_entries stream^=width -of default^=noprint_wrappers^=1:nokey^=1 "%INPUT_VIDEO%" 2^>^&1') do set "VIDEO_WIDTH=%%a"
for /f "delims=" %%a in ('ffprobe -v error -select_streams v:0 -show_entries stream^=height -of default^=noprint_wrappers^=1:nokey^=1 "%INPUT_VIDEO%" 2^>^&1') do set "VIDEO_HEIGHT=%%a"
echo [信息] 视频编码: !VIDEO_CODEC!
echo [信息] 分辨率: !VIDEO_WIDTH!x!VIDEO_HEIGHT!
echo.
:: 获取音频信息
for /f "delims=" %%a in ('ffprobe -v error -select_streams a:0 -show_entries stream^=codec_name -of default^=noprint_wrappers^=1:nokey^=1 "%INPUT_AUDIO%" 2^>^&1') do set "AUDIO_CODEC=%%a"
for /f "delims=" %%a in ('ffprobe -v error -select_streams a:0 -show_entries stream^=sample_rate -of default^=noprint_wrappers^=1:nokey^=1 "%INPUT_AUDIO%" 2^>^&1') do set "SAMPLE_RATE=%%a"
for /f "delims=" %%a in ('ffprobe -v error -select_streams a:0 -show_entries stream^=channels -of default^=noprint_wrappers^=1:nokey^=1 "%INPUT_AUDIO%" 2^>^&1') do set "CHANNELS=%%a"
echo [信息] 音频编码: !AUDIO_CODEC!
echo [信息] 采样率: !SAMPLE_RATE! Hz
echo [信息] 声道数: !CHANNELS!
echo.
:: 确定PCM格式
if "!AUDIO_CODEC!"=="" (
set "PCM_FORMAT=pcm_s24le"
echo [警告] 使用默认PCM格式: pcm_s24le
) else if "!AUDIO_CODEC!"=="unknown" (
set "PCM_FORMAT=pcm_s24le"
echo [警告] 使用默认PCM格式: pcm_s24le
) else (
set "PCM_FORMAT=!AUDIO_CODEC!"
echo [信息] 使用PCM格式: !AUDIO_CODEC!
)
:: 确认继续
set /p "CONTINUE=是否继续?(Y/N): "
if /i not "!CONTINUE!"=="Y" (
echo 用户取消操作
pause
exit /b 0
)
echo [信息] 开始处理视频和音频...
echo.
:: 构建FFmpeg命令
set "FFMPEG_CMD=ffmpeg -i "%INPUT_VIDEO%" -i "%INPUT_AUDIO%" -c:v copy -c:a !PCM_FORMAT! -map 0:v:0 -map 1:a:0 -shortest -y -f avi"
:: 添加音频参数
if not "!SAMPLE_RATE!"=="" (
set "FFMPEG_CMD=!FFMPEG_CMD! -ar !SAMPLE_RATE!"
) else (
echo [警告] 使用默认采样率: 48000 Hz
set "FFMPEG_CMD=!FFMPEG_CMD! -ar 48000"
)
if not "!CHANNELS!"=="" (
set "FFMPEG_CMD=!FFMPEG_CMD! -ac !CHANNELS!"
) else (
echo [警告] 使用默认声道数: 2
set "FFMPEG_CMD=!FFMPEG_CMD! -ac 2"
)
set "FFMPEG_CMD=!FFMPEG_CMD! "%OUTPUT_AVI%""
echo 执行命令:
echo !FFMPEG_CMD!
echo.
:: 执行转换
echo [信息] 正在转换,请稍候...
!FFMPEG_CMD!
if !errorlevel! equ 0 (
echo.
echo [成功] 转换完成!
echo [信息] 输出文件: %OUTPUT_AVI%
:: 显示文件大小
for %%F in ("%OUTPUT_AVI%") do (
set "size=%%~zF"
set /a "sizeMB=!size!/1048576"
echo [信息] 文件大小: !sizeMB! MB
)
) else (
echo.
echo [错误] 转换失败!
)
echo.
pause
exit /b 0
:noargs
echo 用法: 拖拽两个文件到本脚本上
echo 顺序: 视频文件, 音频文件
echo.
echo 或者在命令行中使用:
echo %~nx0 "视频.mp4" "音频.wav"
echo.
echo 输出文件将自动生成在视频同目录下,文件名为: 原视频名_replace.avi
echo.
pause


