如何用C语言编写程序将多个wav文件拼接成一个音频wav文件并播放

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何用C语言编写程序将多个wav文件拼接成一个音频wav文件并播放相关的知识,希望对你有一定的参考价值。

这不是三言两语的事情,合作wav文件操作并不简单。要研究好wav文件结构,读取文件头,再进行分析和操作。
有两种办法:

1.连续播放,例如:

#include <stdio.h>
#include <windows.h>
#include <mmsystem.h>
#pragma comment(lib, "winmm.lib")
int main()
    PlaySound("C:\\\\Users\\\\wang\\\\test1.wav", NULL, SND_FILENAME);
    PlaySound("C:\\\\Users\\\\wang\\\\test2.wav", NULL, SND_FILENAME);
    PlaySound("C:\\\\Users\\\\wang\\\\test3.wav", NULL, SND_FILENAME);
    return 0;


2.系统自带的“windows movie maker”。运行windows movie maker,然后选择“导入音频或音乐”之后把你需要的文件添加进来。然后按照你自己需要排列的顺序把这些文件依次拖到下方的时间线上。然后点左上方的“文件”选项,最后保存电影文件即可。

参考技术A 把几个wav文件拼成一个文件,不是简单的事,各个wav的采样频率还可能不同,有许多工作要做。
简单的办法是连续播放,例如:
#include <stdio.h>
#include <windows.h>
#include <mmsystem.h>
#pragma comment(lib, "winmm.lib")
main()
PlaySound("C:\\Users\\wang\\test1.wav", NULL, SND_FILENAME);
PlaySound("C:\\Users\\wang\\test2.wav", NULL, SND_FILENAME);
PlaySound("C:\\Users\\wang\\test3.wav", NULL, SND_FILENAME);
return 0;
追问

^_^ 很感谢,只是那如果要拼成一个要怎样做
可以告诉我吗?

追答

研究好wav 文件结构,读文件头,读。。。慢慢研究。
http://wenku.baidu.com/view/42ed4f0bf12d2af90242e61c.html
这里没法开课。

本回答被提问者和网友采纳

如何在python中将音频文件(wav格式)拼接成1秒的拼接?

【中文标题】如何在python中将音频文件(wav格式)拼接成1秒的拼接?【英文标题】:How to splice an audio file (wav format) into 1 sec splices in python? 【发布时间】:2016-04-22 17:22:06 【问题描述】:

我正在寻找一个 python 函数来将音频文件(wav 格式)拼接成 1 秒持续时间的拼接,并将每个新的拼接(1 秒持续时间)存储到一个新的 .wav 文件中。

【问题讨论】:

我会从numpy.io.wavfile开始 numpy中不存在,你可能指的是scipy.io.wavfile 如果您愿意使用外部库,请在下面查看我的回答,该回答简洁明了。 【参考方案1】:

真正简单易用的pydub模块,详细内容在here和here以上

pydub 有一个名为make_chunks 的方法,您可以在milliseconds 中指定chunk length

make_chunks(your_audio_file_object, chunk_length_ms)

这是一个将 wav 文件拆分为一秒块的工作代码。我有一个 8.5 秒的文件,所以程序创建了 9 个一秒的块 playable。根据音频持续时间,最后一个块会更小。

from pydub import AudioSegment
from pydub.utils import make_chunks

myaudio = AudioSegment.from_file("myAudio.wav" , "wav") 
chunk_length_ms = 1000 # pydub calculates in millisec
chunks = make_chunks(myaudio, chunk_length_ms) #Make chunks of one sec

#Export all of the individual chunks as wav files

for i, chunk in enumerate(chunks):
    chunk_name = "chunk0.wav".format(i)
    print "exporting", chunk_name
    chunk.export(chunk_name, format="wav")

输出

Python 2.7.9 (default, Dec 10 2014, 12:24:55) [MSC v.1500 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> ================================ RESTART ================================
>>> 
exporting chunk0.wav
exporting chunk1.wav
exporting chunk2.wav
exporting chunk3.wav
exporting chunk4.wav
exporting chunk5.wav
exporting chunk6.wav
exporting chunk7.wav
exporting chunk8.wav
>>> 

【讨论】:

使用 python 代替,sox 是播放音频文件的好工具:***.com/questions/16125614/… 你太棒了;) 如何保存这些块并用于以后的语音处理? chunk.export 方法将可播放的音频块导出到文件(此处为.wav),您可以稍后将其用于音频处理。保存以上块(chunk0.wav ... 到 .. chunk8.wav)在您从上面运行脚本的同一文件夹中。 我正在使用相同的代码来切片音频文件。但我不断收到以下错误:AttributeError:'str'对象没有属性'export'。谁能告诉我这里出了什么问题?【参考方案2】:

您是否考虑过仅使用 numpy 将文件切成采样率长度的切片,可能会将每个切片附加到 numpy 数组列表中。然后,您可以使用您选择的音频工具遍历您的 np.arrays 列表,将每个列表写入声音文件,我个人喜欢声音文件。

import numpy as np
import soundfile as sf

# read into a numpy array
data, sr = sf.read('filename.format')

# split
split = []
noSections = int(np.ceil(len(data) / sr))

for i in range(noSections):
    # get 1 second
    temp = data[i*sr:i*sr + sr] # this is for mono audio
    # temp = data[i*sr:i*sr + sr, :] # this is for stereo audio; uncomment and comment line above
    # add to list
    split.append(temp)

for i in range(noSections):
    # format filename
    filename = 'filename_.format'.format()
    # write to file
    sf.write(filename, split[i], sr)
 

我知道还有其他一些使用不同库函数的答案,但这很好,很纯粹,对我希望的任何事情都有好处

【讨论】:

以上是关于如何用C语言编写程序将多个wav文件拼接成一个音频wav文件并播放的主要内容,如果未能解决你的问题,请参考以下文章

如何在python中将音频文件(wav格式)拼接成1秒的拼接?

如何用 32 位浮点数据编写 wav 文件?

多个wav音频文件合并(连接)成一个文件

如何用c语言插入(背景)音乐

如何用c语言进行文件的批量重命名

如何用jetbrains的Clion编写c语言