2017-06-01 108 views
0

我想从视频元素中记录音频以及从画布录制。 我从视频获取MediaStreamTrack(音频)

var stream = canvas.captureStream(29); 

现在我加入了视频的audioTrack流中。

var vStream = video.captureStream(); 
stream.addTrack(vStream.getAudioTracks()[0]); 

但是这会增加每个视频的速度。由于captureStream()在视频上非常沉重,并且还需要在Chrome中打开一个标志。有没有一种方法可以在不使用captureStream()的情况下从视频元素创建唯一的音频MediaStream。

回答

2

是的,您可以使用Web Audio API的方法createMediaElementSource来获取mediaElement中的音频,然后使用createMediaStreamDestination方法创建一个MediaStreamDestination节点,该节点包含一个MediaStream。

然后,您只需将其全部连接起来,然后就可以将MediaStream和MediaElement的音频一起使用。

// wait for the video starts playing 
 
vid.play().then(_=> { 
 
    var ctx = new AudioContext(); 
 
    // create an source node from the <video> 
 
    var source = ctx.createMediaElementSource(vid); 
 
    // now a MediaStream destination node 
 
    var stream_dest = ctx.createMediaStreamDestination(); 
 
    // connect the source to the MediaStream 
 
    source.connect(stream_dest); 
 
    // grab the real MediaStream 
 
    out.srcObject = stream_dest.stream; 
 
    out.play(); 
 
    });
The video's audio will be streamed to this audio elements : <br> 
 
<audio id="out" controls></audio><br> 
 
The original video element : <br> 
 
<video id="vid" crossOrigin="anonymous" src="https://dl.dropboxusercontent.com/s/bch2j17v6ny4ako/movie720p.mp4?dl=0" autoplay></video>

请注意,您也可以多个数据源连接到这个流,并且还可以与该new MediaStream([stream1, stream2])构造另一个视频流结合起来(这是目前要结合不同的必由之路FF上的流,直到this bug is fixed,应该尽快)。