如何阻止 mediarecorder 中的像素化伪像?
How to stop pixelated artifacts from mediarecorder?
我们正在使用浏览器的MediaRecorder 来记录用户的摄像头。我不明白为什么有些相机会经常记录伪影。并非所有相机都会发生这种情况。
下面是一些截图...
这是视频中的正常图像
然后在一瞬间像素化,然后又恢复到之前的图像。
这是包含此工件的视频的摘录
https://drive.google.com/file/d/1SYMBRjMlvOTO-LnlG5HLX0ncN3NyUXcc/view?usp=sharing
recorder = new MediaRecorder(local_media_stream, {
mimeType: encoding_options,
audioBitsPerSecond: 96000,
videoBitsPerSecond: 8000000,
});
recorder.ondataavailable = function(e) {
that.save_blob(e.data, blob_index);
blob_index++;
}
recorder.start(15000)
为了local_media_stream我只是抓本地音视频
navigator.mediaDevices.getUserMedia({ audio: {
deviceId: { exact: currentMic.deviceId},
channelCount: 1,
noiseSuppression: options.echo_cancellation,
echoCancellation: options.echo_cancellation,
},
video: {
width: { ideal: $("#subscription_id").data("max-width") },
height: { ideal: $("#subscription_id").data("max-height") },
frameRate: 30,
deviceId: { exact: currentCam.deviceId }
}
})
创建这些视频压缩伪像的通常不是相机。它们具有视频压缩的性质,并且在某种程度上取决于计算机的能力。大多数视频帧都是所谓的“帧间帧”,保存着一帧和下一帧之间的压缩差异。要解码帧间需要解码它之前的所有帧。
那些帧间序列以“帧内”开始,也称为瞬时解码器刷新 (IDR) 帧。帧内可以单独解码。但有一个权衡:它们需要更多的压缩视频数据。
当您要求 30 frames/second 时,您会隐含地限制每帧可以容纳多少数据。有时帧内需要降低其质量以使其数据适合时间间隔。
我的观点:您看到的块状现象是帧内。
对此你能做些什么?老实说,MediaRecorder 对视频编码器的工作方式没有太多控制。所以,你可以调整的东西是相当小的。他们是:
帧大小:考虑缩小它。 1080p 视频 (1920x1080) 可能太大了。尝试一些更小的东西。试试 960x540,甚至更小。
帧速率:较慢的帧速率,如 15,会为每个帧分配更多带宽,因此帧内质量更高。降低帧率。
比特率。您正在使用 8 megabits/sec。这对于基于浏览器的编码器来说非常大,可能太大了。它比许多互联网服务提供商的最大上传速度更快。尝试一些更小的东西。从 1 兆比特开始。 (您的高比特率要求可能会使某些计算机中的压缩硬件不堪重负。)
请记住,为在线流媒体压缩视频的人使用大型服务器,并且在这些服务器上压缩一分钟的视频可能需要十分钟或更长时间。他们经常使用 ffmpeg,它有数百种调整压缩的方法。 MediaRecorder 实时完成。
此外,网络摄像头硬件的质量参差不齐。糟糕的网络摄像头有可乐瓶碎片作为镜头和破旧的传感器。好的是非常好的。 None 达到专业视频设备的标准。但是那个设备要几千
并且请记住,压缩视频更像 JPEG,而不是 PNG。它不适合编码高对比度静态图片。
高质量数字视频录制是计算的一个发达的子专业。如果您想要“尽可能最好的音频和视频”,您将不会使用网络浏览器/Javascript/getUserMedia/MediaRecorder。您将使用像 OBS Studio 这样的本机(下载并安装)应用程序。它使您可以更好地控制捕获和压缩过程。
如果您在 2021 年初使用浏览器中嵌入的捕获/压缩技术,您实际上将被限制在每秒几兆比特和一些分辨率限制。
我们正在使用浏览器的MediaRecorder 来记录用户的摄像头。我不明白为什么有些相机会经常记录伪影。并非所有相机都会发生这种情况。
下面是一些截图...
这是视频中的正常图像
然后在一瞬间像素化,然后又恢复到之前的图像。
这是包含此工件的视频的摘录 https://drive.google.com/file/d/1SYMBRjMlvOTO-LnlG5HLX0ncN3NyUXcc/view?usp=sharing
recorder = new MediaRecorder(local_media_stream, {
mimeType: encoding_options,
audioBitsPerSecond: 96000,
videoBitsPerSecond: 8000000,
});
recorder.ondataavailable = function(e) {
that.save_blob(e.data, blob_index);
blob_index++;
}
recorder.start(15000)
为了local_media_stream我只是抓本地音视频
navigator.mediaDevices.getUserMedia({ audio: {
deviceId: { exact: currentMic.deviceId},
channelCount: 1,
noiseSuppression: options.echo_cancellation,
echoCancellation: options.echo_cancellation,
},
video: {
width: { ideal: $("#subscription_id").data("max-width") },
height: { ideal: $("#subscription_id").data("max-height") },
frameRate: 30,
deviceId: { exact: currentCam.deviceId }
}
})
创建这些视频压缩伪像的通常不是相机。它们具有视频压缩的性质,并且在某种程度上取决于计算机的能力。大多数视频帧都是所谓的“帧间帧”,保存着一帧和下一帧之间的压缩差异。要解码帧间需要解码它之前的所有帧。
那些帧间序列以“帧内”开始,也称为瞬时解码器刷新 (IDR) 帧。帧内可以单独解码。但有一个权衡:它们需要更多的压缩视频数据。
当您要求 30 frames/second 时,您会隐含地限制每帧可以容纳多少数据。有时帧内需要降低其质量以使其数据适合时间间隔。
我的观点:您看到的块状现象是帧内。
对此你能做些什么?老实说,MediaRecorder 对视频编码器的工作方式没有太多控制。所以,你可以调整的东西是相当小的。他们是:
帧大小:考虑缩小它。 1080p 视频 (1920x1080) 可能太大了。尝试一些更小的东西。试试 960x540,甚至更小。
帧速率:较慢的帧速率,如 15,会为每个帧分配更多带宽,因此帧内质量更高。降低帧率。
比特率。您正在使用 8 megabits/sec。这对于基于浏览器的编码器来说非常大,可能太大了。它比许多互联网服务提供商的最大上传速度更快。尝试一些更小的东西。从 1 兆比特开始。 (您的高比特率要求可能会使某些计算机中的压缩硬件不堪重负。)
请记住,为在线流媒体压缩视频的人使用大型服务器,并且在这些服务器上压缩一分钟的视频可能需要十分钟或更长时间。他们经常使用 ffmpeg,它有数百种调整压缩的方法。 MediaRecorder 实时完成。
此外,网络摄像头硬件的质量参差不齐。糟糕的网络摄像头有可乐瓶碎片作为镜头和破旧的传感器。好的是非常好的。 None 达到专业视频设备的标准。但是那个设备要几千
并且请记住,压缩视频更像 JPEG,而不是 PNG。它不适合编码高对比度静态图片。
高质量数字视频录制是计算的一个发达的子专业。如果您想要“尽可能最好的音频和视频”,您将不会使用网络浏览器/Javascript/getUserMedia/MediaRecorder。您将使用像 OBS Studio 这样的本机(下载并安装)应用程序。它使您可以更好地控制捕获和压缩过程。
如果您在 2021 年初使用浏览器中嵌入的捕获/压缩技术,您实际上将被限制在每秒几兆比特和一些分辨率限制。