英文:
Is there a way to capture audio and video from an HTML video tag in Safari?
问题
在Chrome和Firefox中,我们可以使用HTMLMediaElement.captureMediaStream()来捕获流。但是HTMLMediaElement.captureMediaStream()在Safari中不受支持。
视频标签的源是以段接收的HLS数据。
在Safari中是否有其他方式来捕获媒体数据作为MediaStream?
英文:
In chrome and firefox, we can user HTMLMediaElement.captureMediaStream() to capture a stream. But HTMLMediaElement.captureMediaStream() is not supported by Safari.
Source of the video tag is hls data received in segments.
Is there any other way capture media data as a MediaStream in Safari?
答案1
得分: 1
直接采用captureMediaStream方法在Safari中不受支持,至少在目前这个时候是这样的,正如你所见,但你可以使用基于浏览器的ffmpeg方法来实现。
在过去,在浏览器中运行ffmpeg对大多数任务来说都不现实,因为它太大且速度太慢,但是最近基于WASM(Web Assembly)的ffmpeg实现已经使其更容易访问。
你可以构建自己的基于ffmpeg的解决方案,利用像这样的库:
你需要注意需要支持SharedArrayBuffer:
只有支持SharedArrayBuffer的浏览器才能使用ffmpeg.wasm,你可以在这里查看完整列表。
上面提到的链接在这里:https://caniuse.com/sharedarraybuffer
我发现它在许多常见的ffmpeg任务中表现良好,但对于较大的视频文件很敏感 - 我还没有尝试过将HLS转换为文件,所以你需要进行实验以确定是否符合你的需求。这里有一个演示,你可以在上面测试你的用例:https://ffmpegwasm.netlify.app/#demo
你想要使用的ffmpeg命令取决于音频,但很可能是:
ffmpeg -i in.m3u8 -acodec copy -bsf:a aac_adtstoasc -vcodec copy out.mp4
(查看此问题和答案以获取更多信息:https://stackoverflow.com/q/33108105/334402)
还有一些开源的现成解决方案,你可以查看 - 例如:
英文:
The direct captureMediaStream approach is not supported in Safari, at least at this time, as you saw, but one way you could do this is to use a browser ffmpeg based approach.
In the past running ffmpeg in the browser was not realistic for most tasks as it was simply too big and too slow, but recent WASM (web assembly) based ffmpeg implementations have made it more accessible.
You can build your own ffmpeg based solution leveraging a library like:
You do need to be aware of the need for SharedArrayBuffer support:
> Only browsers with SharedArrayBuffer support can use ffmpeg.wasm, you can check HERE for the complete list.
The link referred to above is here: https://caniuse.com/sharedarraybuffer
I have found that it works well for many common ffmpeg tasks but it is sensitive to larger video files - I have not tried HLS to file conversion so you would need to experiment to see it meets your needs. There is a demo here which you may be able to test your use case on: https://ffmpegwasm.netlify.app/#demo
The ffmpeg command you want to use depends on the audio but it likely:
> ffmpeg -i in.m3u8 -acodec copy -bsf:a aac_adtstoasc -vcodec copy out.mp4
(see this question and answers for more info: https://stackoverflow.com/q/33108105/334402)
There are also some open source ready built solutions which you would look at - e.g:
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论