ffmpeg吧 关注:1,289贴子:4,642
  • 9回复贴,共1

来个大佬纠正一下脚本哦。。

只看楼主收藏回复

我想把文件夹里面mp4文件转换成mkv文件。然后用mp4里面的右声道作为第一音轨,左声道作为第二音轨。。但是老是不成功。。搞不懂。。来个大哥纠正一下哦。。看下面。。
# FFmpeg命令:转换音频声道顺序并复制视频
command = [
'ffmpeg',
'-i', input_path, # 输入文件
'-c:v', 'copy', # 视频流直接复制
'-map', '0:v:0', # 映射第一个视频流
'-map', '0:a:0', # 映射第一个音频流
'-map', '0:a:0', # 再次映射第一个音频流
'-c:a', 'aac', # 音频编码格式(可以根据需要调整)
'-ac', '2', # 音频声道数(单声道)
'-channel_layout', 'stereo',
'-af', 'pan=stereo|c0=c1|c1=c0', # 调整声道顺序(右->左,左->右)
output_path # 输出文件
这样搞出来两个音轨都是左声道的。。不管怎么修改c0=c1|c1=c0 这个,反正两个音轨都一样。。要不就两个都是左声道,要不两个都是右声道。。完全误解。。ai也是搞不好。。


IP属地:广东1楼2025-03-10 22:58回复
    有人指点一下么?


    IP属地:广东来自Android客户端2楼2025-03-10 23:04
    回复
      这样转换视频文件实在太快了,已经不能回到使用格式工厂的那些日子了


      IP属地:广东来自Android客户端3楼2025-03-10 23:05
      回复
        这里要有一点编程的基础知识,滤镜是一串变量的传递,按顺序依次给下一个变量赋值。或者给取变量名,并赋值。这里就必须使用变量名打包成品。
        分离成两条音轨, 以下用 L、R
        channelsplit=channel_layout=stereo[L][R] - map [L] - map [R]


        IP属地:浙江4楼2025-03-10 23:32
        收起回复
          import os
          import subprocess
          import shutil
          def convert_videos(input_folder, output_folder):
          # 检查输入文件夹是否存在
          if not os.path.exists(input_folder):
          print(f"输入文件夹不存在: {input_folder}")
          return
          # 创建输出文件夹(如果不存在)
          os.makedirs(output_folder, exist_ok=True)
          # 遍历输入文件夹中的所有文件
          for filename in os.listdir(input_folder):
          input_path = os.path.join(input_folder, filename)
          # 检查是否是文件
          if os.path.isfile(input_path):
          # 获取文件扩展名
          file_ext = os.path.splitext(filename)[1].lower()
          # 检查是否是视频文件(可以根据需要扩展支持的格式)
          if file_ext in ['.mp4', '.avi', '.mov', '.mkv', '.flv', '.wmv']:
          # 构造输出文件路径
          base_name = os.path.splitext(filename)[0]
          output_path = os.path.join(output_folder, f"{base_name}.mkv")
          # FFmpeg命令:转换音频声道顺序并复制视频
          command = [
          'ffmpeg',
          '-i', input_path, # 输入文件
          '-c:v', 'copy', # 视频流直接复制
          '-map', '0:v:0', # 映射第一个视频流
          '-map', '0:a:0', # 映射第一个音频流
          '-map', '0:a:0', # 再次映射第一个音频流
          '-c:a', 'aac', # 音频编码格式(可以根据需要调整)
          '-ac', '2', # 音频声道数(立体声)
          '-filter_complex', '"[0:a]channelsplit=channel_layout=stereo[left][right]"', # 调整声道顺序(右->左,左->右)
          output_path # 输出文件
          ]
          # 执行FFmpeg命令
          print(f"正在转换: {filename}")
          try:
          subprocess.run(command, check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
          print(f"转换完成: {output_path}")
          except subprocess.CalledProcessError as e:
          print(f"转换失败: {filename}")
          print(f"错误信息: {e.stderr.decode()}")
          if __name__ == "__main__":
          # 输入和输出文件夹路径
          input_folder = "E:\\input" # 替换为你的输入文件夹路径
          output_folder = "E:\\output" # 替换为你的输出文件夹路径
          # 调用转换函数
          convert_videos(input_folder, output_folder)


          IP属地:广东5楼2025-03-11 00:26
          收起回复
            写这么多,看不懂。这个可以嘛?
            ffmpeg -i "input" -filter_complex "channelsplit=channel_layout=stereo[z][y]" -map v -map "[y]" -map "[z]" -c:v copy "out.mkv" -y


            IP属地:广东6楼2025-03-11 03:40
            回复