📜  替换 mp4 视频 linux 的声音 - Shell-Bash (1)

📅  最后修改于: 2023-12-03 15:10:33.909000             🧑  作者: Mango

替换 mp4 视频 linux 的声音 - Shell-Bash

本文将介绍如何使用 Shell-Bash 编写脚本,来将 mp4 视频文件中原有的声音替换成自定义的声音。使用这种方式可以实现批量处理,并且无需使用第三方软件或网站。

程序逻辑
  1. 将 mp4 视频文件中的视频和原有声音分离出来。
  2. 编码自定义的音频文件为适合 mp4 视频使用的格式。
  3. 将自定义的音频和分离出来的视频合并为一个新的 mp4 视频文件。
命令行工具和依赖

在编写脚本之前,我们需要确保在系统中安装了以下命令行工具和依赖:

  • ffmpeg:用于音视频操作。
  • ffprobe:用于获取音视频文件的信息。
  • mp4box: 用于 MP4 视频文件的封装。

可以使用以下命令检查是否已安装:

$ ffmpeg -version
$ ffprobe -version
$ mp4box -version

如果已经安装,则会显示相应的版本信息。如果没有安装,则需要先安装它们才能继续执行后续步骤。

编写脚本

下面是一个完整的脚本,它可以将 mp4 视频文件中的原有声音替换成自定义的声音:

#!/bin/bash

#----------- 输入参数 -----------
video_file=$1
audio_file=$2
out_file=$3

#-------- 默认值设置 ----------
if [ -z "$video_file" ] || [ -z "$audio_file" ] || [ -z "$out_file" ]
then
    echo "Usage: $0 <video_file> <audio_file> <out_file>"
    exit 1;
fi

if [ ! -f "$video_file" ]
then
    echo "Error: '$video_file' not exist."
    exit 1;
fi

if [ ! -f "$audio_file" ]
then
    echo "Error: '$audio_file' not exist."
    exit 1;
fi

#---------- 提取出视频和音频 -----------
ffmpeg -i "$video_file" -vn -acodec copy "$video_file.aac"
ffmpeg -i "$video_file" -an -vcodec copy "$video_file.h264"

#---------- 检查音视频长度是否匹配 -----------
v_duration=$(ffprobe -i "$video_file.h264" -show_entries format=duration -v quiet -of csv="p=0")
a_duration=$(ffprobe -i "$audio_file" -show_entries format=duration -v quiet -of csv="p=0")

if (( $(echo "$v_duration != $a_duration" | bc -l) ))
then
    echo "Error: video and audio length not match."
    exit 1;
fi

#---------- 转换音频格式 -----------
ffmpeg -i "$audio_file" -acodec aac -strict -2 "$audio_file.m4a"

#-------- 合并音视频 -----------
mp4box -add "$video_file.h264" -add "$audio_file.m4a" -new "$out_file"

#-------- 删除中间文件 -----------
rm -f "$video_file.h264" "$video_file.aac" "$audio_file.m4a"
说明

上述代码段使用 Shell-Bash 语言编写的脚本实现,包含以下几个步骤:

  • 输入参数检查:脚本接收三个参数,即原 mp4 视频文件路径、自定义音频文件路径和输出视频文件路径,如果没有输入参数或者输入参数不正确,则提示使用方法并退出脚本。
  • 原视频和音频分离:用 ffmpge 工具实现。
  • 检查音视频长度:使用 ffprobe 工具获取音视频时长,并检查是否一致。
  • 转换音频格式:将自定义的音频文件编码为 aac 格式,以便与 mp4 视频文件合并。
  • 合并音视频:将分离出来并编码格式的原视频文件和自定义音频文件合并为一个新的 mp4 视频文件。
  • 删除中间文件:删除在上面几个步骤中生成的中间文件。
使用方法

使用该脚本的方法很简单,只需在终端中输入以下命令:

$ bash replace_audio.sh <video_file> <audio_file> <out_file>

其中 <video_file> 是原 mp4 视频文件路径,<audio_file> 是自定义声音文件路径,<out_file> 是替换声音后的新视频文件路径。

示例

假设我们有一个名为 test.mp4 的视频文件,我们想要将它的声音替换成一个名为 myaudio.mp3 的声音文件,输出为 test_new.mp4,那么我们只需输入以下命令:

$ bash replace_audio.sh test.mp4 myaudio.mp3 test_new.mp4

程序会根据上述说明对视频文件进行处理,并将新文件保存为 test_new.mp4

注意事项
  • 脚本中使用的工具都是开源软件,但必须保证它们已经正确安装,否则可能会导致程序无法正常运行。
  • 替换声音时,请确保自定义的声音文件格式和视频文件可用的格式一致,否则可能会导致程序无法正常运行。
  • 脚本中生成的中间文件会在处理完成后自动删除,请不要手动修改或删除它们,否则可能导致程序执行错误。