如何使用标记同步两个音频文件

时间:2014-06-24 10:05:02

标签: ffmpeg html5-audio webrtc audio-processing voice-recording

我正在开展一个项目,我们使用 WebRTC RecordRTC 库来录制音频文件。

我希望能够处理服务器端的音频文件以确保良好的同步。

为此,我考虑使用听不见的声音标记来标记每条记录的开头,以便分析新记录,然后用ffmpeg操纵起始偏移(我已经用它来压缩由 RecordRTC 创建的原始文件。

事情是我以前从未做过任何先进的音频处理,我四处寻找并找不到合适的方法。

还有另一种更好的处理同步的方法吗?如果没有,如果我能得到关于标记技术的一些提示,我将不胜感激。 谢谢。

修改 我忘了提及那些不知道 RecordRTC 如何工作的人,记录是在 Javascript 的客户端完成的。同步问题来自于javascript不善于同步调用这一事实。

该过程如下:

1)用户记录自己

[User 1] -> Records on his browser an audio file
   |
   | Saves raw audio file (call it audio_1.ogg)
   |
[Server]

2)另一位用户想要加入user_1的项目

[User 2]  <--- Fetch audio_1.ogg (in an audio html tag) --- [Server]
   |
   | Press record
   |
[Webapp] -> Plays audio_1.ogg and starts recording audio_2.ogg
   |
   | Saves audio_2.ogg when record is over
   |
[Server]

同步问题来自于 Javascript 无法确保处理启动记录的函数和负责开始播放现有函数的函数音频文件同时发生。

根据项目中已经有多少音频文件(因为它不限于两个),我最终会得到约50/100 ms的间隙。

1 个答案:

答案 0 :(得分:1)

您应该使用--enable-exclusive-audio标志在Windows上删除此类大约100毫秒的延迟。

您甚至可以use ffmpeg-commands删除延迟:

ffmpeg -i audio-file.wav -itsoffset -00:00:01 -i video-file.webm -map 0:0 -map 1:0 output-file-name.webm

RecordRTC有How to fix audio/video sync issues on chrome?部分:

recordAudio = RecordRTC( stream, {
     onAudioProcessStarted: function( ) {
         recordVideo.startRecording();
     }
});

recordVideo = RecordRTC(stream, {
    type: 'video'
});

recordAudio.startRecording();

更新

啊,忘了回答实际的问题:

ffmpeg -i audio-1.wav -itsoffset -00:00:01 -i audio-2.wav -map 0:0 -map 1:0 output.wav