在chrome和firefox中,我们可以使用HTMLMediaElement.captureMediaStream()来捕获流。但 Safari 不支持 HTMLMediaElement.captureMediaStream()。
视频标签的来源是分段接收的 hls 数据。
是否有其他方法在 Safari 中将媒体数据捕获为 MediaStream?
Safari 不支持直接 captureMediaStream 方法,至少目前如此,如您所见,但实现此目的的一种方法是使用基于浏览器 ffmpeg 的方法。
过去,在浏览器中运行 ffmpeg 对于大多数任务来说并不现实,因为它太大且太慢,但最近基于 WASM(Web 程序集)的 ffmpeg 实现使其更易于访问。
您可以利用以下库构建自己的基于 ffmpeg 的解决方案:
您确实需要意识到 SharedArrayBuffer 支持的必要性:
上面提到的链接在这里:https://caniuse.com/sharedarraybuffer
我发现它对于许多常见的 ffmpeg 任务效果很好,但它对较大的视频文件很敏感 - 我没有尝试过 HLS 到文件转换,因此您需要进行试验才能看到它满足您的需求。这里有一个演示,您可以在其中测试您的用例:https://ffmpegwasm.netlify。应用程序/#demo
您要使用的 ffmpeg 命令取决于音频,但很可能:
(有关详细信息,请参阅此问题和答案:将 HLS (m3u8) 转换为 MP4)
还有一些开源现成的解决方案可供您查看 - 例如:
Safari 不支持直接 captureMediaStream 方法,至少目前如此,如您所见,但实现此目的的一种方法是使用基于浏览器 ffmpeg 的方法。
过去,在浏览器中运行 ffmpeg 对于大多数任务来说并不现实,因为它太大且太慢,但最近基于 WASM(Web 程序集)的 ffmpeg 实现使其更易于访问。
您可以利用以下库构建自己的基于 ffmpeg 的解决方案:
您确实需要意识到 SharedArrayBuffer 支持的必要性:
上面提到的链接在这里:https://caniuse.com/sharedarraybuffer
我发现它对于许多常见的 ffmpeg 任务效果很好,但它对较大的视频文件很敏感 - 我没有尝试过 HLS 到文件转换,因此您需要进行试验才能看到它满足您的需求。这里有一个演示,您可以在其中测试您的用例:https://ffmpegwasm.netlify。应用程序/#demo
您要使用的 ffmpeg 命令取决于音频,但很可能:
(有关详细信息,请参阅此问题和答案:将 HLS (m3u8) 转换为 MP4)
还有一些开源现成的解决方案可供您查看 - 例如: