这是一个很好的问题,而不是"告诉我代码是什么工作",而是"如何在逻辑上处理这种情况"问题.
简而言之,我通过RTSP从IP摄像机进入视频+音频.
视频和音频通过单独的线程(如下所示)逐帧解码并记录到单个mp4容器中.
问题是由于TimeSpan结束时间和每个视频帧的开始时间不精确,视频和音频会逐渐变得越来越不同步.
对于每个视频帧,它应该是1 /帧速率= 0.0333667000333667的持续时间,但它正在使用(即使使用FromTicks()方法),第一帧的开始时间= 0.0和结束时间0.0333667.
我可以调整29.97的视频解码器帧速率值(它从摄像机的设置声明的帧速率中拉出),导致视频在音频之前,或滞后于音频 - 这只是制作每个视频mediaBuffer.StartTime和mediaBuffer .EndTime要么太早,要么太晚,与音频相比.
随着时间的推移,微小的十进制截断最终导致视频和音频不同步 - 录制时间越长,两个轨道获得的同步越多.
我真的不明白为什么会这样,因为舍入误差在逻辑上不重要.
即使我只有1秒的精度,我每秒只会写一个视频帧,它在时间线上的位置大致应该是+ - 1秒,这应该使每个渐进帧相同+ - 1秒到达应有的位置,不会逐渐增加错位.我想象每个框架看起来都像这样:
[<-------- -1第二个-------->预期的确切帧时间<-------- + 1s -------->] --- -------------------------------------------------记录帧时间--------
我在这里错过了什么吗?
我没做"新帧开始时间=最后帧结束时间,新帧结束时间=新帧开始时间+ 1 /帧速率" - 我实际上在做"新帧开始时间=帧索引 - 1 /帧速率,新帧结束时间=帧索引/帧速率".
也就是说,我正在根据它们应该具有的预期时间来计算帧开始和结束时间(帧时间=帧位置/帧速率).
我的代码正在做的是:
预计时间----------预计时间----------预计时间帧时间帧时间
我在数学上理解这个问题,我只是不明白为什么十进制截断证明了这个问题,或者逻辑上知道解决它的最佳解决方案是什么.
如果我实现的内容是"每x帧,使用"(1 /帧速率)+一些"以弥补所有丢失的时间,那么可以将帧匹配到应该的位置,或者只是导致视频混乱?
public void AudioDecoderThreadProc()
{
TimeSpan current = TimeSpan.FromSeconds(0.0);
while (IsRunning)
{
RTPFrame nextFrame = jitter.FindCompleteFrame();
if (nextFrame == null)
{
System.Threading.Thread.Sleep(20);
continue;
}
while (nextFrame.PacketCount > 0 && IsRunning)
{
RTPPacket p = nextFrame.GetNextPacket();
if (sub.ti.MediaCapability.Codec == …Run Code Online (Sandbox Code Playgroud) 我的目标是在录制设备的麦克风输入时以低延迟播放本地文件.我来到Superpowered库,因为从文档中它提供了低延迟功能.我使用SuperpoweredAdvancedAudioPlayer和SuperpoweredAndroidAudioIO创建了播放器,它播放得很好.
SuperpoweredAndroidAudioIO具有带有参数boolean enableInput,boolean enableOutput的construcor.目前我正在使用enableInput == false和enableOutput == true.当我把这些参数设置为true时 - 没有效果.
我想知道是否可以同时录制文件和播放其他文件?
在库中还有SuperpoweredRecorder类,但它表示不能直接写入磁盘.并且需要使用createWAV,fwrite,closeWAV方法.我已经尝试过单独使用Recorder,但质量不好(它比实际录音快两三倍+声音被分散).这是我用过的最简单的录音代码:
void SuperpoweredFileRecorder::start(const char *destinationPath) {
file = createWAV(destinationPath, sampleRate, 2);
audioIO = new SuperpoweredAndroidAudioIO(sampleRate, bufferSize, true, false, audioProcessing, NULL, bufferSize); // Start audio input/output.
}
void SuperpoweredFileRecorder::stop() {
closeWAV(file);
audioIO->stop();
}
static bool audioProcessing(void *clientdata, short int *audioInputOutput, int numberOfSamples, int samplerate) {
fwrite(audioInputOutput, sizeof(short int), numberOfSamples, file);
return false;
}
Run Code Online (Sandbox Code Playgroud)
可能我不能将Superpowered用于此目的,只需要直接使用OpenSL ES进行录制.
提前致谢!
我使用visual studio 2010创建了一个空的c ++控制台应用程序,并从http://blogs.msdn.com/b/matthew_van_eerde/archive/2008/12/16/sample-wasapi-loopback-capture-record拖放源文件-what-you-hear.aspx但是当我点击重建时,我得到了一大堆错误,这些错误并没有指向我在源代码中的任何地方...源代码提供的可执行文件工作正常所以你能检查一下并告诉我是什么我错过了
更新:
Error 1 error LNK2001: unresolved external symbol _AvRevertMmThreadCharacteristics@4 c:\Users\Admin\documents\visual studio 2010\Projects\tr\tr\loopback-capture.obj tr
Error 2 error LNK2001: unresolved external symbol __imp__mmioWrite@12 c:\Users\Admin\documents\visual studio 2010\Projects\tr\tr\loopback-capture.obj tr
Error 3 error LNK2001: unresolved external symbol __imp__mmioCreateChunk@12 c:\Users\Admin\documents\visual studio 2010\Projects\tr\tr\loopback-capture.obj tr
Error 4 error LNK2001: unresolved external symbol __imp__mmioAscend@12 c:\Users\Admin\documents\visual studio 2010\Projects\tr\tr\loopback-capture.obj tr
Error 5 error LNK2001: unresolved external symbol _AvSetMmThreadCharacteristicsW@8 c:\Users\Admin\documents\visual studio 2010\Projects\tr\tr\loopback-capture.obj tr
Error 6 error LNK2001: unresolved external symbol …Run Code Online (Sandbox Code Playgroud) 如何记录来自多个画布的流?即,当我将一个画布更改为另一个时,它必须将活动画布记录到第一个。
我这样做了:
stream = canvas.captureStream();
mediaRecorder = new MediaRecorder(stream, options);
mediaRecorder.ondataavailable = handleDataAvailable;
mediaRecorder.start(10);
function handleDataAvailable(event) {
recordedBlobs.push(event.data);
}
Run Code Online (Sandbox Code Playgroud)
但是当添加另一个流时,只记录第一部分。我正在将记录的数据推送到全局数组。
大家好,我尝试在我的 reactJS 应用程序中实现getUserMedia来录制音频。
我努力将我的 mediaRecorder this.state 对象链接到状态更改,并使媒体设备 API 获得我提供应用程序所需的功能。
当我在视图上单击“开始记录”时,我的控制台返回给我:
TypeError: this.state.mediaRecorder.start is not a function
48 | startRecord() {
49 |
50 |
51 | this.setState({mediaRecorder:this.state.mediaRecorder.start()});
52 | alert("start record function started =, mediaRecorder state : " + this.state.mediaRecorder.state)
53 | console.log(this.state.mediaRecorder.state); // > recording
54 | console.log("recorder started"); View compiled
Run Code Online (Sandbox Code Playgroud)
这是我的 app.js :
import React from "react";
// import "./install.js" ;
import "./mediaDevices-getUserMedia-polyfill.js";
class RecorderAPI extends React.Component {
constructor(props) {
super(props);
this.handleDelete = this.handleDelete.bind(this);
this.startRecord = …Run Code Online (Sandbox Code Playgroud) 我需要暂停然后恢复录音,我正在使用AVAudioRecorder进行录音...有人知道怎么做吗?任何帮助将非常感谢!非常感谢Peace Massy
我将开始服务以开始录音.当我试图停止时,它显示以下消息
06-27 17:21:30.138: E/MediaRecorder(6122): stop called in an invalid state: 0
Run Code Online (Sandbox Code Playgroud)
我不确定其他功能如上传数据到服务器是否会影响结果(未在Asyck Task中实现,只调用方法)
如果我没有捕获运行时异常,有时它可能会显示处理程序异常(完成活动,停止记录)
06-27 17:32:35.988: W/System.err(6818): java.lang.IllegalStateException
06-27 17:32:35.988: W/System.err(6818): at android.media.MediaRecorder.stop(Native Method)
06-27 17:32:35.988: W/System.err(6818): at tvbpv.test.EOrderSystem1.RecordService.stopRecording(RecordService.java:109)
06-27 17:32:35.988: W/System.err(6818): at tvbpv.test.EOrderSystem1.RecordService.onDestroy(RecordService.java:46)
06-27 17:32:35.988: W/System.err(6818): at android.app.ActivityThread.handleStopService(ActivityThread.java:2401)
06-27 17:32:35.988: W/System.err(6818): at android.app.ActivityThread.access$2000(ActivityThread.java:127)
06-27 17:32:35.988: W/System.err(6818): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1225)
06-27 17:32:35.988: W/System.err(6818): at android.os.Handler.dispatchMessage(Handler.java:99)
06-27 17:32:35.988: W/System.err(6818): at android.os.Looper.loop(Looper.java:137)
06-27 17:32:35.988: W/System.err(6818): at android.app.ActivityThread.main(ActivityThread.java:4519)
06-27 17:32:35.988: W/System.err(6818): at java.lang.reflect.Method.invokeNative(Native Method)
06-27 17:32:35.988: W/System.err(6818): at java.lang.reflect.Method.invoke(Method.java:511)
06-27 17:32:35.988: W/System.err(6818): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:794) …Run Code Online (Sandbox Code Playgroud) 我正在使用janus-gateway在Web浏览器中进行记录。录制完成后,将生成两个文件,一个是音频,另一个是视频。两者都有格式mjr。如何将这两个文件合并为一个文件?
我正在录音.现在我想直接在本地保存录制的音频.当我录制音频时,它返回blob URL,如:
blob:http://example.com/7737-4454545-545445.
当我点击此URL时,它会播放录制的音频.现在我将jb中的blob URL发送到PHP脚本以保存本地目录,但它无法正常工作.
我怎样才能做到这一点?
我正在尝试用 arduino 构建一个录音机。现在,该设置有一个麦克风,记录输入并输出到 Arduino uno 的模拟输入。
如何将(时间戳、数据)读数转换为 .WAV?我知道有更多的库可以做到这一点,但我试图了解 .WAV 的结构,并希望能够在 C\C++ 中自己编写脚本。
感谢您的关注!