今天写代码运行的时候出现了一个问题,写文章记录一下最终处理方法
复制命令:在 Windows 上使用 os.system('copy ...') 可能会导致一些问题。使用 shutil.copy 来代替
import shutil
...
shutil.copy(audio_file, output_file)
路径拼接:建议使用 os.path.join 来构造文件路径,这样可以确保路径在不同操作系统上的兼容性。
audio_file = os.path.join(output_folder, f"line_{index}.wav")
output_file = os.path.join(unprocessed_folder, f"line_{index}.wav")
调试信息:在未复制的情况下,打印出实际要复制的文件路径和目标路径,以确保路径的正确性。
print(f"Copying from {audio_file} to {output_file}")
原始代码中使用 os.system('copy ...')
可能导致未能复制未处理音频文件的原因包括:
-
命令格式问题:在 Windows 系统中,
os.system
直接执行的是命令行命令,任何格式错误(例如,路径中包含空格而未用引号括起来)都会导致命令失败。 -
路径问题:如果
audio_file
或unprocessed_folder
的路径不正确,copy
命令也会失败。使用shutil.copy
时,它会直接处理文件路径,并在内部管理这些细节。 -
错误反馈:
os.system
只返回命令的执行状态,但不显示任何详细错误信息,导致你可能无法看到具体的失败原因。而使用shutil.copy
可以直接捕获异常,从而知道是什么导致了失败。 -
环境问题:在某些情况下,系统环境变量或用户权限可能影响命令的执行。使用 Python 内置的库(如
shutil
)可以减少这种依赖,使代码更加健壮。
通过使用 shutil.copy
,避免了这些潜在的问题,因为它更好地处理了路径、错误和平台兼容性,确保了音频文件能够正确复制到目标文件夹。
我的需求如下:
读取updated_ch.txt,比较两个值大小
如果值4>2,处理音频变速,处理后的音频保存到processed_wav_files文件夹下
否则,直接将对应音频复制到unprocessed_wav_files文件夹下
原始代码最终运行结果没有达到我的预期,出现了一个问题,unprocessed_wav_files文件夹是空的,其他结果都正常。
最后调整了代码。
# 原始代码
import os
import re
import ffmpeg
# 文件配置
updated_ch_file = 'updated_ch.txt' # 要读取的文本文件
output_folder = 'output_wav_files' # 存放音频文件的文件夹
processed_folder = 'processed_wav_files' # 存放处理后的音频文件的文件夹
unprocessed_folder = 'unprocessed_wav_files' # 存放未处理的音频文件的文件夹
# 创建输出文件夹
os.makedirs(processed_folder, exist_ok=True) # 如果处理后的文件夹不存在,则创建它
os.makedirs(unprocessed_folder, exist_ok=True) # 如果未处理的文件夹不存在,则创建它
# 提取第二个和第四个数值的函数
def extract_values(line):
match = re.search(r'(\d+): \[(\d+), (\d+), .*?, (\d+)\]', line)
if match: # 如果匹配成功
first_value = int(match.group(1))
second_value = int(match.group(3)) # 提取第二个数值并转换为整数
fourth_value = int(match.group(4)) # 提取第四个数值并转换为整数
return first_value,second_value, fourth_value # 返回提取的数值
return None, None, None
# 处理音频文件的函数
def process_audio(index, second_value, fourth_value):
# 构造对应的音频文件名
audio_file = f"{output_folder}/line_{index}.wav"
if os.path.exists(audio_file): # 检查音频文件是否存在
if fourth_value > second_value: # 如果第四个数值大于第二个数值
# 使用 FFmpeg 进行音频变速处理
output_file = f"{processed_folder}/line_{index}.wav" # 处理后音频文件的路径
speed_factor = fourth_value / second_value # 计算变速因子
try:
# 调用 FFmpeg 进行音频处理
ffmpeg.input(audio_file).filter('atempo', speed_factor).output(output_file).run(overwrite_output=True)
print(f"Processed: {audio_file} to {output_file} with speed factor {speed_factor:.2f}")
except ffmpeg.Error as e: # 如果处理过程中出现错误
print(f"Error processing {audio_file}: {e}") # 输出错误信息
else: # 如果第四个数值不大于第二个数值
# 直接复制未处理的音频到 unprocessed 文件夹
output_file = f"{unprocessed_folder}/line_{index}.wav"
os.system(f'copy "{audio_file}" "{unprocessed_folder}"') # 使用系统命令复制文件
print(f"Unprocessed: {audio_file} copied to {unprocessed_folder}")
else:
print(f"File not found: {audio_file}") # 如果音频文件不存在,输出提示信息
# 主程序入口
if __name__ == "__main__":
# 读取 updated_ch.txt 文件
with open(updated_ch_file, 'r', encoding='utf-8') as f:
lines = f.readlines() # 读取所有行并存储在列表中
# 遍历每一行,使用 enumerate 获取索引和行内容
for index, line in enumerate(lines, start=1):
first_value, second_value, fourth_value = extract_values(line) # 提取第二个和第四个数值
if second_value is not None and fourth_value is not None: # 如果成功提取到数值
print(f"第{first_value}行,第二个数值: {second_value}, 第四个数值: {fourth_value}") # 输出提取的数值
process_audio(index, second_value, fourth_value) # 处理对应的音频文件
以下代码运行结果能实现预期结果
# 修改后
import os
import re
import ffmpeg
import shutil # 引入 shutil 用于复制文件
# 文件配置
updated_ch_file = 'updated_ch.txt' # 要读取的文本文件
output_folder = 'output_wav_files' # 存放音频文件的文件夹
processed_folder = 'processed_wav_files' # 存放处理后的音频文件的文件夹
unprocessed_folder = 'unprocessed_wav_files' # 存放未处理的音频文件的文件夹
# 创建输出文件夹
os.makedirs(processed_folder, exist_ok=True) # 如果处理后的文件夹不存在,则创建它
os.makedirs(unprocessed_folder, exist_ok=True)
# 提取第二个和第四个数值的函数
def extract_values(line):
match = re.search(r'(\d+): \[(\d+), (\d+), .*?, (\d+)\]', line)
if match:
first_value = int(match.group(1))
second_value = int(match.group(3))
fourth_value = int(match.group(4))
return first_value, second_value, fourth_value
return None, None, None
# 处理音频文件的函数
def process_audio(index, second_value, fourth_value):
# 构造对应的音频文件名
audio_file = os.path.join(output_folder, f"line_{index}.wav")
if os.path.exists(audio_file):
if fourth_value > second_value:
# 使用 FFmpeg 进行音频变速处理
output_file = os.path.join(processed_folder, f"line_{index}.wav")
speed_factor = fourth_value / second_value
try:
# 调用 FFmpeg 进行音频处理
ffmpeg.input(audio_file).filter('atempo', speed_factor).output(output_file).run(overwrite_output=True)
print(f"Processed: {audio_file} to {output_file} with speed factor {speed_factor:.2f}")
except ffmpeg.Error as e:
print(f"Error processing {audio_file}: {e}")
else:
# 直接复制未处理的音频到 unprocessed 文件夹
output_file = os.path.join(unprocessed_folder, f"line_{index}.wav")
shutil.copy(audio_file, output_file) # 使用 shutil.copy
print(f"Unprocessed: {audio_file} copied to {unprocessed_folder}")
else:
print(f"File not found: {audio_file}")
if __name__ == "__main__":
with open(updated_ch_file, 'r', encoding='utf-8') as f:
lines = f.readlines()
# 遍历每一行,使用 enumerate 获取索引和行内容
for index, line in enumerate(lines, start=1):
first_value, second_value, fourth_value = extract_values(line)
if second_value is not None and fourth_value is not None:
print(f"第{first_value}行,第二个数值: {second_value}, 第四个数值: {fourth_value}")
process_audio(index, second_value, fourth_value)