-
2020-08-30 16:48:33
关于音频的内容,我边学习,边实践也总结了一些,从最开始实现一个简单的web音乐播放器的自定义工具栏,到后来的实现简单的音频频谱图.直到今天的对音频数据进行的进一步操作,我也是一点点的在进步.虽然很多地方,并不是那么完美和准确,但是希望能和大家能共同学习进步.
一、准备工作
声音的基本原理
首先关于音频的一些原理性的内容,在之前的https://blog.csdn.net/yun_master/article/details/104133520关于音频频谱的博客中已经简单介绍过了,这里就不详细展开来说了
前端操作内存的方法
但是如果要实现对音频PCM数据的修改,只是了解了声音的原理,恐怕还是有点不太够用.
这里还需要了解es6中提供的arrayBuffer以及其视图的相关内容,这里推荐阮一峰老师的es6入门这本书的关于arrayBuffer这个章节,进行简单的了解web audio API
这方面的内容,也是很重要的一部分内容、但是由于web Audio API实在太多了,往往在用的时候再去看,已然是来不及了.那个时候往往是一头雾水,面对海量API无从下手,不知道从哪里入手.所以推荐利用空闲时间、从最基础的api看起.慢慢会发现,真正常用的功能所需要的,并不是特别多.
推荐MDN关于这一部分的介绍:https://developer.mozilla.org/zh-CN/docs/Web/API/Web_Audio_API二、音频处理
如果想要快速实现一些针对音频PCM数据的处理工作,推荐使用crunker这个方法库,虽然功能有限,但是对于获取音频二进制数据、合并、拼接等工作,安装方便、使用简单.重要的是性能真的不错.
npm地址:https://www.npmjs.com/package/crunker音频裁剪
原理:音频裁剪,其实就是对音频数据的裁剪,并拷贝出来,创建一份新的音频数据.这就是音频的裁剪.
//获取audioBuffer数据的方式之一 fetch(audioUrl) .then(res => res.arrayBuffer()) .then(buffer => { // 获取音频二进制数据 const audioCtx = new audioContext(); audioCtx.decodeAudio(buffer) .then(audioBuffer => { // 获取音频解码后的audioBuffer数据 // to do sth }) }); /** * 音频裁剪 * @param audioBuffer 待裁剪的数据 * @param duration 音频总时长 * @param startOffset 裁剪偏移时间,单位s */ clipAudio(audioBuffer,duration,startOffset = 0){ return new Promise((resolve,reject) => { // 获取音频通道数量 const channels = audioBuffer,.numberOfChannels; // 获取采样率 const rate = audioBuffer,.sampleRate; // 计算截取后需要的采样数量 const endOffset = rate * duration; const frameCount = endOffset - 0; // 创建新的audioBuffer数据 const newAudioBuffer = new AudioContext().createBuffer(channels,frameCount,rate); // 创建Float32的空间,作为copy数据的载体 const anotherArray = new Float32Array(frameCount); // 裁剪后放置的起始位置 const offset = 0; // 遍历通道,将每个通道的数据分别copy到对应的newAudioBuffer的通道 for(let channel = 0; channel < channels;channel++){ audioBuffer.copyFromChannel(anotherArray, channel, rate * startOffset); newAudioBuffer.copyToChannel(anotherArray, channel, offset); } // 完成裁剪 resolve(newAudioBuffer); }) }
音频音量调整
fetch(url) .then(res => res.arrayBuffer) .then(buffer => { const audioCtx = new AudioContext(); audioCtx.decodeAudioData(buffer) .then(audioBuffer => { //获取声道数量 const channels = audioBuffer.numberOfChannels; // 更改每个通道内的数据 for(let channel = 0; channel < channels; channel++){ const channelData = audioBuffer.getChannelData(channel); for(let j = 0; j < channelData.length; j++){ channelData[j] = channelData[j] * volumn; // volunm [0,1] } } }) })
除了音频裁剪之外的功能,可以利用Crunker这个第三方的库来实现.具体实现方式,可以参考crunker源码
安装
npm i crunker -S
Example
let audio = new Crunker(); audio.fetchAudio("/audio/url/1.m\p3","/audio/url/2.mp3") .then(buffers => { // => [AudioBuffer,AudioBuffer] audio.mergeAudio(buffers); // 将两个音频进行合成(非拼接) }) .then(merged => { // => AudioBuffer audio.export(merged,"audio/mp3"); }) .then(output => { // => {blob,element,url} audio.download(output.blob); document.addpend(output.element); console.log(output.url); }) .then(error => { // => Error Message }) audio.notSupported(() => { // Handle no brower support })
API
crunker.fetchAudio(soneURL,anotherSongURL)
获取音频buffer数据
const crunker = new Crunker(); crunker.fetchAudio(url1,url2,url3,...) .then(buffers => { // 获取到全部音频的buffer数据,buffers为数组 })
crunker.mergeAudio(arrayOfBuffers)
合成音频为一个buffer
const resultBuffer = crunker.mergeAudio([buffer1,buffer2,buffer3,...]);
crunker.concatAudio(arrayOfBuffers);
拼接音频为一个buffer
const resultBuffer = crunker.concatAudio([buffer1,buffer2,buffer3,...]);
crunker.export(buffer,type)
导出blob和url对象
type为可选参数:‘audio/mp3’, ‘audio/wav’, ‘audio/ogg’const blob = crunker.export(audioBuffers, "audio/mp3");
crunker.download(blob,fileName)
自动下载
crunker.play(blob)
开始播放
audio.notSupported(callback)
如果用户浏览器不支持Web audio API ,自行定义代码.
更多相关内容 -
电话录音 分割
2013-01-04 11:29:10本程序将电话录音中的空白作为分割边界,将电话录音进行分割 -
python对批量WAV音频进行等长分割的方法实现
2020-09-27 10:23:27主要介绍了python对批量WAV音频进行等长分割的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 -
自动检测,分割和分类通宵录音中与打ore有关的信号
2021-03-03 17:40:18自动检测,分割和分类通宵录音中与打ore有关的信号 -
Segmentation:Praat 代码,用于分割作为 Learning To Talk 项目一部分收集的录音
2021-06-18 07:00:25分割 Praat 代码,用于分割作为 Learning To Talk 项目一部分收集的录音 -
多声音录音机:非常基本的应用程序,用于从麦克风录制声音并使用静音分割声音-matlab开发
2021-06-01 16:06:02此应用程序可用于了解如何使用麦克风(和计时器)以及如何录音。 只需执行文件,然后单击“测试”并说一个词(等待 1 秒)说另一个词,等等。 您可以保存和加载数据库。 我用这个软件进行语音识别,但我只在这个... -
qt 基于QAudioRecorder实现的录音以及基于QMediaPlayer实现的录音播放,使用ffmpeg解析音频并且带音频波形...
2020-09-25 11:00:541.此工具是qt 基于QAudioRecorder实现的录音以及基于QMediaPlayer实现的录音播放,使用ffmpeg解析音频并且带音频波形图实现,可根据需要选择输入、输出音频设备,音频文件格式、音频编码格式、音频频率以及音频通道... -
音频分割合并
2014-03-07 06:54:36可随意按段数或时间分割合并mp3 最好的是可以自己分析音频频率 帮助你分割 -
视频无损分割软件LosslessCut v3.42.0一款不重新编码的视频和无损质量切割的软件.exe
2022-01-18 10:43:45LosslessCut 专业的视频无损分割软件,用于修剪或不重新编码的视频和无损质量切割一个免费的工具。非常适合轻松处理从摄像机,GoPro等拍摄的大视频文件。让您快速摆脱无用的零件。该程序不执行任何解码或编码,因此... -
蓝光影音Mp3分割录音软件
2009-07-22 22:35:50蓝光影音Mp3录音机 对MP3进行分割 录音操作 -
录音截取软件(教程) 录音太长,想把它截成两段
2021-04-14 03:33:27录音是一件比较好玩的事情,有时候想唱上两句欣赏下自己美妙的歌声也是可以录下来滴,或者录一段祝福的话语用作视频的后期配音,这就涉及到录音的后期编辑问题了,今天所讲的是录音时间太长了,想分割截取成两段或者...录音是一件比较好玩的事情,有时候想唱上两句欣赏下自己美妙的歌声也是可以录下来滴,或者录一段祝福的话语用作视频的后期配音,这就涉及到录音的后期编辑问题了,今天所讲的是录音时间太长了,想分割截取成两段或者多个文件,下面即刻为大家奉上这个录音截取软件!跟着我看下去吧。
录音截取软件功能可不止截取分割这一个呢,可以合并、截取,转换格式等,需要的别等着了快下载吧
。安装完成以后,首页这里就有功能说明的,今天主要讲分割,所以双击“音乐分割”就可以开始操作了。
音乐分割的界面也是时间简洁明了的,第一步,先导入录音文件,由于需要对文件一个一个进行处理,一次只能添加一个音频,好在处理起来够快。点击“添加文件”按钮,选中要处理的音频,如果文件无法显示,在格式那里下拉框选择“所有文件”,确定以后就添加成功了,然后为新分割的音频选择一个输出目录,点击“下一步”。
第二步需要设置分割时间,这里提供有四种方法:时间长度、文件大小、平均分割、手动分割。需要用到哪种方式选择前面的按钮即可,前面三种方法只要输入对应的数字,然后点击“分割”按钮,软件会自动分割好,这比较简单,重点讲解一下手动分割。
选择“手动分割”按钮以后,下方会出现一条时间轴和一个浮标,拖动浮标到对应的时间点停止,浮标对应的时间点代表分割的时间点,然后鼠标点击一下时间框后面的工具按钮,表示:设置当前时间点也分割点。
接下来时间轴上方再次出现一个可移动的浮标,拖动到对用时间点以后再次点击工具按钮,确定第二个分割时间点,依次类推,直到全部分割完成,然后“下一步”。
这时候录音截取软件开始工作啦!一小会的功夫就完成了,“确定”以后就可以预览做好的录音文件了。
分割好的录音文件如下,与原音质没有区别,大家可以放心使用喽。狸窝也有如何录制唱或录制音频制作MV的教程方案,如有需要请参考学习狸窝宝典www.leawo.cn/abc 或联系狸窝在线客服
之前有小伙伴问了 :不知道手机录音的文件储存在哪里,一般手机型号不同,储存地方也不同,在录音结束选择保存的时候,会提示保存在哪个文件夹的,留意一下就可以,大多数都储存在VOICE 、Audio、record,sounds等这类文件夹里面。录音截取分割到这里就讲解完毕,需要转换格式的也可以用它哦。
精品教程推荐
-
代码_string19h_说话人_说话人分割聚类_
2021-09-30 12:35:54实现说话人分割聚类功能,里面提供了一段录音 -
实现分割音频
2022-03-04 10:18:08**目的:**将一个音频分割成等时长的小音频 一开始借鉴这个,但是只能实现剪切前几秒的音频,不能满足需要。 https://www.zhangxinxu.com/wordpress/2020/07/js-audio-clip-copy-upload/ 由于目前在vue中解决不了...**目的:**将一个音频分割成等时长的小音频
一开始借鉴这个,但是只能实现剪切前几秒的音频,不能满足需要。
https://www.zhangxinxu.com/wordpress/2020/07/js-audio-clip-copy-upload/由于目前在vue中解决不了直接将分割音频,所以采用其他方式,用python+ffmpeg写接口实现
主要代码:
# 支持mp3、wav、ogg、flac、amr、ac3 # 不支持 mp4\wma\aac from fileinput import filename from pydub import AudioSegment from pydub.utils import make_chunks import os file_dir = ".\handleAudio\\" # 获取要分割的名称和格式 def file_name(file_dir): for root, dirs, files in os.walk(file_dir): global filename global filetype global file file = files[0] filename = files[0].split(".")[0] filetype = files[0].split(".")[1] file_name(file_dir) url = ".\handleAudio\\" + file audio = AudioSegment.from_file(url, filetype) cutTime = 60000 ##切割的毫秒数 ##将文件切割为CutTimeDef秒一块 chunks = make_chunks(audio, cutTime) for i, chunk in enumerate(chunks): ##枚举,i是索引,chunk是切割好的文件 newName = filename + "_{0}." + filetype; chunk_name = newName.format(i) print(chunk_name) ##保存文件 chunk.export(".\cutAudio\\" + chunk_name, format=filetype)
这个实现需要依赖外部插件ffmpeg,这个直接下载代码,放在项目中,并且配置文件
借鉴网址
https://blog.csdn.net/qq_41661056/article/details/102930764 -
MP3分割器,铃声制作,录音制作
2011-01-10 17:19:28MP3切割利器,铃声制作,录音制作。功能强大,可以任意剪切,多语言版 -
蓝光影音Mp3录音机2.54绿色版
2019-07-29 22:40:55蓝光影音Mp3分割器免费版是一款小巧精致的Mp3分割器,Mp3转换器软件,可以很简单的将一段Mp3切割成多个片断,每个片段可以制作淡入淡出效果,而且可以增大Mp3本身的声音。除此之外,Mp3分割器还可以压缩mp3文件... -
小快笔录音整理工具V3.0绿色免费版.rar
2019-09-04 20:07:24软件介绍: 本程序非常适合从事秘书及新闻工作者,从事律师等职业者,经常整理领导讲话或者录音文件比较多的人群使用。它可以一键控制录音语音播放速度,...可插入分割线,插入当前时间秒数,设置记录的字体大小。 -
将图像按亮度进行分割的matlab代码-nchi_data_tools:将NCHI项目中多个源的输出转换为WEKA可读格式
2021-06-01 22:38:36将图像首先进行分割的matlab代码自述文件 介绍 NCHI 数据工具有助于将 NCHI 项目中多个来源的输出转换为 WEKA 可读格式,并在数据集之间进行相似性分析。 它主要由两部分组成,使用MATLAB编写。 除了花费数小时收集... -
split-record:分割唱片,例如从黑胶唱片
2021-05-01 01:15:42给定任何ffmpeg支持的音频格式的录音(例如,来自乙烯基光盘的录音)(理想的是,诸如WAV或flac之类的无损录音), split-record会将单个录音拆分为多个MP3文件。 您必须在$ PATH上安装了ffmpeg 。 建议用法: cat... -
功能包含有美颜,滤镜,贴纸,特效,录制,分割录制,录制录音,变声,配乐,rtmp直播推流,图片转视频,...
2021-02-02 21:23:51功能包含有美颜,滤镜,贴纸,特效,录制,分割录制,录制,变声,配乐,rtmp直播推流,图片转视频,剪辑等功能。 效果 音视频录制编辑 片段加载失败 播放器 如果播放器效果加载失败 使用方式 #### 1,添加远程依赖 ... -
在Android中分割音频文件
2021-07-19 18:04:39I have an app that records audio using MediaRecorder from MIC whenever a phone call is present, i need to be able to save the last x minutes from this recording when the call is finished - e.g....I have an app that records audio using MediaRecorder from MIC whenever a phone call is present, i need to be able to save the last x minutes from this recording when the call is finished - e.g. split the audio file the recording created.
I searched for this and all i could find is how to split a .wav file by directly deleting bytes from the file. But i am saving the file in:
MediaRecorder.OutputFormat.THREE_GPP with encoding:
MediaRecorder.OutputFormat.AMR_NB and I didn't find a way to split this type of file.
This is my code:
public class Recorder
{
private MediaRecorder myRecorder;
public String outputFile = null;
private Context context = null;
public Recorder(Context context_app)
{
context = context_app;
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss", Locale.getDefault());
df.setTimeZone(TimeZone.getDefault());
String time = df.format(new Date());
outputFile = Environment.getExternalStorageDirectory().
getAbsolutePath() + "/"+time+".3gpp"; //this is the folder in which your Audio file willl save
myRecorder = new MediaRecorder();
myRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
myRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
myRecorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB);
myRecorder.setOutputFile(outputFile);
}
public void start() {
try {
myRecorder.prepare();
myRecorder.start();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
Toast.makeText(context, e.getMessage(),
Toast.LENGTH_SHORT).show();
// prepare() fails
e.printStackTrace();
}
Toast.makeText(context, "Start recording...",
Toast.LENGTH_SHORT).show();
}
public void stop() {
try {
myRecorder.stop();
myRecorder.reset();
myRecorder.release();
myRecorder = null;
Toast.makeText(context, "Stop recording...",
Toast.LENGTH_SHORT).show();
} catch (RuntimeException e) {
// no valid audio/video data has been received
e.printStackTrace();
}
}
}
How can i split the THREE_GPP by time and save the part I need in a separate file?
Also, i know nothing about manipulating bytes and files directly,so please elaborate if it is the way you solved it.
Thanks in advance
解决方案
Use FFMPEG library to cut/split the part of any media file. By the way, compiling FFMPEG is another hard part but you can use pre-compiled library like https://github.com/WritingMinds/ffmpeg-android-java .
Here is a sample about how to compile & use FFMPEG command: https://github.com/JesusMartinAlonso/Video4Share . From the sample, I could able to split 3gp files as the following way:
// ffmpeg command sample: "-y -i inputPath -ss 00:00:02 -codec copy -t 00:00:06 outputPath"
public String getSplitCommand(String inputFileUrl, String outputFileUrl,
String start, String end) {
if ((TextUtils.isEmpty(inputFileUrl) && (TextUtils.isEmpty(outputFileUrl)))) {
return null;
}
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("-y ")
.append("-i ")
.append(inputFileUrl).append(" ")
.append("-ss ")
.append(start).append(" ")
.append("-codec ")
.append("copy ")
.append("-t ")
.append(end).append(" ")
.append(outputFileUrl);
return stringBuilder.toString();
}
public void executeBinaryCommand(FFmpeg ffmpeg, ProgressDialog progressDialog, final String command) {
if (!TextUtils.isEmpty(command)) {
try {
ffmpeg.execute(command, new ExecuteBinaryResponseHandler() {
@Override
public void onFailure(String response) {
progressDialog.setMessage(response);
}
@Override
public void onSuccess(String response) {
progressDialog.setMessage(response);
}
@Override
public void onProgress(String response) {
progressDialog.setMessage(response);
}
@Override
public void onStart() {
progressDialog.show();
}
@Override
public void onFinish() {
progressDialog.dismiss();
}
});
} catch (FFmpegCommandAlreadyRunningException exception) {
exception.printStackTrace();
}
}
}
-
剪映导入本地音频之后分割失败解决
2021-09-14 10:09:27剪映剪辑视频时导入本地音频进行分割,分割一次之后第二段有音轨段却没有声音。觉得这种现象非常奇怪。 这个剪辑是照片拼凑类型的,想拿一个废料草稿试一下,废料草稿导入的是视频类型的,一开始留意了一下这一点,... -
如何恢复录音删除的录音文件_电脑录音软件如何定时自动录音
2020-11-06 03:07:3801最近小编有很多朋友都在咨询关于定时录音的问题,我想他们可能也是看中了本人的才华和美貌,所以才来咨询鄙人。所以,我一定不负众望,好好的教大家如何实现这个问题!02据我所知(鄙人才疏学浅),手机上估计是没有... -
Java切割录音文件
2021-11-29 15:48:441.Java切割录音,目前我用到的是java的原生Jar包,并没有用到框架,接下来我就把代码分享一下 首先了解整体过程:如果你的音频文件是wav就直接切割,如果你的音频文件是mp3,先转换成wav格式然后进行切割: ... -
电话按键识别(内含按键录音).rar
2019-12-21 23:56:451、读取录音,2、端点检测,3、分割信号,4、识别号码,5、重复3-4,直到识别完毕,6、输出信号。内有所需函数和代码。 -
通话录音_隐私条款
2021-04-12 11:22:06通话录音尊重并保护所有使用服务用户的个人隐私权。为了给您提供更准确、更有个性化的服务,通话...本隐私权政策属于通话录音服务使用协议不可分割的一部分。 适用范围 (A) 通话录音无需注册帐号,也不需要提供的个人注 -
广播电台专用多通道录音系统
2010-05-24 23:39:35HX电台慢录系统是一款多通道录音系统(在一台PC机上最高可以同时录制8个通道的音频信息),有手动、语音、计划三种录音方式...文件的录音时长可更具录音方式自由设定,并可按照设定的时间间隔对录音文件进行自动分割。 -
前端webrtc基础 —— 录音篇
2021-04-24 11:43:17如果想要播放,需转换成pcm格式PCM:pcm格式通过三个参数来描述【采样频率、采样位数、声道数】,从网上找到一张图:pcm的核心思想水平和垂直分割成若干小块,然后用这些坐标上的点近似的描述一个波(声音)输入采样... -
WondershareStreamingAudioRecorder(网页音乐录音软件)V2.2.2.1无限制特别版
2019-07-30 15:31:36Wondershare Streaming Audio Recorder是一个使用虚拟声卡来录制由...录制后,你可以分割音频文件,编辑ID3标签,如标题,艺术家和流派。 您还可以添加录制的文件到 iTunes, Windows Media Player或 Winamp播放器。需要 -
超级mp3录音机 最2010加强版
2010-06-01 23:03:54Mp3文件的分割,合并,增益调节,录音,格式转换,混音合成等功能,蓝光影音Mp3录音机一个软件全部搞定,而且可视化,更专业。 【软件功能】 将wav文件压缩成mp3文件; 从麦克风录制声音,可直接录制为mp3; 从...