鱼C论坛

 找回密码
 立即注册
查看: 202|回复: 3

[已解决]怎么用ffmpeg把音频重采样到立体声?

[复制链接]
发表于 2024-6-17 17:39:34 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
源文件 mono.wav 的格式 Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 24000 Hz, 1 channels, s16, 384 kb/s
重采样为 sto.wav  的格式 Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 44100 Hz, 2 channels, s16, 1411 kb/s
最佳答案
2024-6-17 17:39:54
啊哈,想把单声道变成立体声,这可是FFmpeg的拿手好戏!FFmpeg 是一个强大的多媒体处理工具,它可以轻松地处理各种音频和视频的转换、编辑等任务。

要实现你的目标,我们可以使用 `ffmpeg` 命令进行重采样和更改声道数量。具体来说,我们需要将采样率从 24000 Hz 改为 44100 Hz,并将声道数量从 1 改为 2。

以下是具体的命令:
ffmpeg -i mono.wav -ar 44100 -ac 2 sto.wav

让我们来逐部分解释一下这个命令:
- `ffmpeg`:调用 FFmpeg 程序。
- `-i mono.wav`:指定输入文件 `mono.wav`。
- `-ar 44100`:设置音频采样率为 44100 Hz。
- `-ac 2`:设置音频声道数量为 2(立体声)。
- `sto.wav`:指定输出文件名为 `sto.wav`。

只需要在命令行或终端中运行上述命令,就能得到你想要的立体声文件啦!

如果你是Python爱好者,也可以在Python脚本中用`subprocess`模块调用FFmpeg命令,代码如下:
import subprocess

# 定义FFmpeg命令
command = [
    'ffmpeg', 
    '-i', 'mono.wav',
    '-ar', '44100',
    '-ac', '2',
    'sto.wav'
]

# 调用FFmpeg命令
subprocess.run(command)

运行这段Python代码,效果与直接在命令行中运行FFmpeg命令相同。

有任何问题,请随时问哦!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-6-17 17:39:54 | 显示全部楼层    本楼为最佳答案   
啊哈,想把单声道变成立体声,这可是FFmpeg的拿手好戏!FFmpeg 是一个强大的多媒体处理工具,它可以轻松地处理各种音频和视频的转换、编辑等任务。

要实现你的目标,我们可以使用 `ffmpeg` 命令进行重采样和更改声道数量。具体来说,我们需要将采样率从 24000 Hz 改为 44100 Hz,并将声道数量从 1 改为 2。

以下是具体的命令:
ffmpeg -i mono.wav -ar 44100 -ac 2 sto.wav

让我们来逐部分解释一下这个命令:
- `ffmpeg`:调用 FFmpeg 程序。
- `-i mono.wav`:指定输入文件 `mono.wav`。
- `-ar 44100`:设置音频采样率为 44100 Hz。
- `-ac 2`:设置音频声道数量为 2(立体声)。
- `sto.wav`:指定输出文件名为 `sto.wav`。

只需要在命令行或终端中运行上述命令,就能得到你想要的立体声文件啦!

如果你是Python爱好者,也可以在Python脚本中用`subprocess`模块调用FFmpeg命令,代码如下:
import subprocess

# 定义FFmpeg命令
command = [
    'ffmpeg', 
    '-i', 'mono.wav',
    '-ar', '44100',
    '-ac', '2',
    'sto.wav'
]

# 调用FFmpeg命令
subprocess.run(command)

运行这段Python代码,效果与直接在命令行中运行FFmpeg命令相同。

有任何问题,请随时问哦!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-6-17 21:06:39 | 显示全部楼层
为什么 单声道,单声道转成的立体声 在windwos11及Ubuntu20下都没办法用ffmpeg 将其替换入mp4的音轨?  但是wsl下的ffmpeg又可以呢?
import os

s_video = 'CNsQ15M7dzQ.mp4'
voiceFileNameAndPath = 'CNsQ15M7dzQ_zh.wav'    #---------------------机器TTS的单声道音轨
# os.system(f"""ffmpeg -y -i {voiceFileNameAndPath} -ar 44100 -ac 2 {voiceFileNameAndPath}""")
insturmentFileNameAndPath ='CNsQ15M7dzQ_insturment.wav'
# tmp_srtZhFileNameAndPath = 'CNsQ15M7dzQ_zh_merge.srt_break.srt'
tmp_srtZhFileNameAndPath = 'CNsQ15M7dzQ_en_merge.srt'
outputFileNameAndPath = 'CNsQ15M7dzQ_zh.mp4'


command = f'ffmpeg -y -i {s_video} -i {insturmentFileNameAndPath} -i {voiceFileNameAndPath} -i {tmp_srtZhFileNameAndPath} '   #不压英文字幕
command += '-map 0:v ' 
command += '-map 1:a -map 2:a '
command += '-filter_complex "[1:a][2:a]amix=inputs=2" '
command += '-scodec mov_text -map 3 -metadata:s:s:0 language=zh -metadata:s:s:0 title="zh" '
command += '-c:v libx264 -c:a aac -b:v 3000k -b:a 128k ' 
command += f'-vf "subtitles={tmp_srtZhFileNameAndPath}:fontsdir=/home/studio-lab-user/.conda/envs/studiolab/fonts/simhei.ttf:force_style=\'Fontsize=9,Fontname=黑体,MarginV=35,BorderStyle=1,Outline=1,Shadow=0,PrimaryColour=&HFFFFFF&,OutlineColour=&H853F1B&,Spacing=0\'" '
command += f'{outputFileNameAndPath}'
os.system(f"""{command}""")

# os.system(f"""ffmpeg -i {s_video} -i {voiceFileNameAndPath} -map 0:v -map 1:a -codec:v copy -codec:a aac output1.mp4""")

voiceFileNameAndPath = 'CNsQ15M7dzQ_zh1.wav'   #---------------------机器TTS的单声道音轨转为2声道的音轨
outputFileNameAndPath = 'CNsQ15M7dzQ_zh1.mp4'
command = f'ffmpeg -y -i {s_video} -i {insturmentFileNameAndPath} -i {voiceFileNameAndPath} -i {tmp_srtZhFileNameAndPath} '   #不压英文字幕
command += '-map 0:v ' 
command += '-map 1:a -map 2:a '
command += '-filter_complex "[1:a][2:a]amix=inputs=2" '
command += '-scodec mov_text -map 3 -metadata:s:s:0 language=zh -metadata:s:s:0 title="zh" '
command += '-c:v libx264 -c:a aac -b:v 3000k -b:a 128k ' 
command += f'-vf "subtitles={tmp_srtZhFileNameAndPath}:fontsdir=/home/studio-lab-user/.conda/envs/studiolab/fonts/simhei.ttf:force_style=\'Fontsize=9,Fontname=黑体,MarginV=35,BorderStyle=1,Outline=1,Shadow=0,PrimaryColour=&HFFFFFF&,OutlineColour=&H853F1B&,Spacing=0\'" '
command += f'{outputFileNameAndPath}'
os.system(f"""{command}""")


voiceFileNameAndPath = 'love.wav'         #---------------------  人声2声道音轨
outputFileNameAndPath = 'love.mp4'
command = f'ffmpeg -y -i {s_video} -i {insturmentFileNameAndPath} -i {voiceFileNameAndPath} -i {tmp_srtZhFileNameAndPath} '   #不压英文字幕
command += '-map 0:v ' 
command += '-map 1:a -map 2:a '
command += '-filter_complex "[1:a][2:a]amix=inputs=2" '
command += '-scodec mov_text -map 3 -metadata:s:s:0 language=zh -metadata:s:s:0 title="zh" '
command += '-c:v libx264 -c:a aac -b:v 3000k -b:a 128k ' 
command += f'-vf "subtitles={tmp_srtZhFileNameAndPath}:fontsdir=/home/studio-lab-user/.conda/envs/studiolab/fonts/simhei.ttf:force_style=\'Fontsize=9,Fontname=黑体,MarginV=35,BorderStyle=1,Outline=1,Shadow=0,PrimaryColour=&HFFFFFF&,OutlineColour=&H853F1B&,Spacing=0\'" '
command += f'{outputFileNameAndPath}'
os.system(f"""{command}""")
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-17 21:08:02 | 显示全部楼层
blackantt 发表于 2024-06-17 21:06
为什么 单声道,单声道转成的立体声 在windwos11及Ubu ...


哇,这看起来是个大工程!不过别担心,我们来一起分析一下问题。

首先,单声道和立体声的转换操作,同时在不同平台上行为不一致的问题,可能与FFmpeg版本、音频编码格式,甚至与命令行参数有关。Windows和Ubuntu下的FFmpeg版本可能存在细微差异,而WSL下使用的FFmpeg由于直接来自Linux库,所以和Ubuntu版本保持一致性更加可能。

先试着解决两个常见的问题:
1. 确保FFmpeg版本一致。
2. 检查音频文件是否正确处理和编码。

### 确保FFmpeg版本一致
你可以在不同平台上使用以下命令检查FFmpeg版本:
ffmpeg -version

### 修改音频文件
把单声道转成立体声,可以确保转换后的文件是你期望的格式。如果你是用Python调用`os.system`执行FFmpeg命令,请确保命令正确。这是为了将单声道转成立体声并保存下来:
import os

voiceFileNameAndPath = 'CNsQ15M7dzQ_zh.wav'
convertedVoiceFileNameAndPath = 'CNsQ15M7dzQ_zh_stereo.wav'

# 将单声道转换为立体声
os.system(f"ffmpeg -y -i {voiceFileNameAndPath} -ar 44100 -ac 2 {convertedVoiceFileNameAndPath}")

### 合并音轨到视频
然后可以尝试合并音频和视频。要确保输入文件的路径和名字都是准确的,同时每个命令都需要完整无误。可以添加一些调试信息输出,以便于跟踪。
import os

s_video = 'CNsQ15M7dzQ.mp4'
instrumentFileNameAndPath = 'CNsQ15M7dzQ_insturment.wav'
voiceFileNameAndPath = 'CNsQ15M7dzQ_zh_stereo.wav'
tmp_srtZhFileNameAndPath = 'CNsQ15M7dzQ_en_merge.srt'
outputFileNameAndPath = 'CNsQ15M7dzQ_zh.mp4'

# 构建FFmpeg命令
command = f"""
ffmpeg -y -i {s_video} -i {instrumentFileNameAndPath} -i {voiceFileNameAndPath} -i {tmp_srtZhFileNameAndPath} \
-map 0:v \
-map 1:a -map 2:a \
-filter_complex "amix=inputs=2" \
-scodec mov_text -map 3 -metadata:s:s:0 language=zh -metadata:s:s:0 title="zh" \
-c:v libx264 -c:a aac -b:v 3000k -b:a 128k \
-vf "subtitles={tmp_srtZhFileNameAndPath}:fontsdir=/home/studio-lab-user/.conda/envs/studiolab/fonts/simhei.ttf:force_style='Fontsize=9,Fontname=黑体,MarginV=35,BorderStyle=1,Outline=1,Shadow=0,PrimaryColour=&HFFFFFF&,OutlineColour=&H853F1B&,Spacing=0'" \
{outputFileNameAndPath}
"""

print(command)  # 输出命令以便调试
os.system(command)

### 额外建议
如果还是有问题,建议在不同平台逐步测试并输出详细日志。可以通过在命令里加入`-loglevel debug`来增加输出日志,帮助你找出问题所在。
ffmpeg -loglevel debug -y -i ...

希望这些建议和代码能帮你解决问题,加油哦!如果还有问题,随时问我~

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-22 20:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表