多个音频轨道合并成一个

本文介绍了如何使用AudioContext进行音频tracks的合并,以及结合MediaRecorder实现屏幕录制并保存为本地文件。首先,展示了将多个tracks合并到一个AudioContext中,然后详细阐述了获取屏幕stream,添加音频轨道,以及如何开始和停止录制屏幕的过程。
摘要由CSDN通过智能技术生成

AudioContext 文档

一、音频 tracks 合并

const audioContext = new AudioContext()
const dest = audioContext.createMediaStreamDestination()


// 多个tracks 创建 多个 stream

const tracksList = [tracks, tracks, tracks]


tracksList.forEach((tracks) => {
   const stream= new MediaStream()
         stream.addTrack(tracks)
         // 轨道合并到 dest
         audioContext.createMediaStreamSource(stream).connect(dest)
})



// 输出合并完成的 tracks

console.log('tracks',  dest.stream.getTracks()[0])

二、录制屏幕保持到本地

   步骤解析

  • 获取屏幕 stream,选择整个屏幕录制,“ stream没有浏览器内的声音 ”
  • 获取 audio 标签的 stream 的 轨道 加入到 屏幕 stream
  • 使用 MediaRecorder 开始录制
/*
      * 共享屏幕 获取屏幕 stream
      * video 屏幕画面
      * audio 麦克风声音 (没有麦克风也不会导致失败)
      * */
      navigator.mediaDevices.getDisplayMedia({ video: true, audio: true }).then(success, error);

      const success = (stream) => {

        // 先声明 一个 屏幕的轨道,后面用于监听关闭共享屏幕
        const  screenTracks = stream.getTracks()[0]

        // 获取浏览器标签的声音 (如果不需要可以不使用)
        const audioEl = document.getElementById('audio标签')
        if (!audioEl) return
        const audiotracksList = audioEl.captureStream().getTracks()
        if (audiotracksList.length) {
          // stream 加入 标签轨道
          audiotracksList.forEach((tracks) => {
            stream.addTrack(tracks)
          })
        }


        // 录制并且保存至本地文件
        var mime = MediaRecorder.isTypeSupported("video/webm; codecs=vp9") ?"video/webm; codecs=vp9" :"video/webm";
        var mediaRecorder = new MediaRecorder(stream, {mimeType: mime});
        var chunks = [];
        mediaRecorder.addEventListener('dataavailable', function(e) {
          chunks.push(e.data)
        })
        //停止
        mediaRecorder.addEventListener('stop', function(){
          var blob = new Blob(chunks, {type: chunks[0].type});
          var url = URL.createObjectURL(blob);
          var a = document.createElement('a');
          a.href = url;
          // 保存的文件和文件后缀
          a.download = 'video.mp4';
          a.click();
        })
        //手动启动
        mediaRecorder.start(1000)

        // 监听用户是否点击了,系统的关闭共享
        screenTracks.addEventListener("ended", () => {
          // 关闭录制
          mediaRecorder.stop()
        });
        // 十秒关闭录制
        setTimeout(() => {
          // 关闭录制
          mediaRecorder.stop()
        }, 10000)
      }
      const error = (err) => {
        console.log(`获取失败: ${err}`)
      }

三、其他内容

        1、获取标签内的 所有 指定标签

      const canvasBox = document.getElementById('标签')

      const dataList = canvasBox.getElementsByTagName('指定标签')

     
     // 如果需要循环dataList,使用 for 不要使用 forEach

        

Android音视频合并可以通过使用MediaMuxer类来实现。MediaMuxer类是Android SDK提供的一个用于将多个媒体流合并一个文件的类。 以下是实现步骤: 1.创建一个MediaMuxer对象。 2.添加音视频轨道。 3.将音视频数据写入轨道。 4.释放MediaMuxer对象。 以下是示例代码: ``` public class MediaMuxerHelper { private MediaMuxer mMediaMuxer; private int mVideoTrackIndex = -1; private int mAudioTrackIndex = -1; private boolean mMuxerStarted = false; public void startMuxer(String outputFilePath) { try { mMediaMuxer = new MediaMuxer(outputFilePath, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4); } catch (IOException e) { e.printStackTrace(); } } public void addVideoTrack(MediaFormat videoFormat) { if (mMediaMuxer != null) { mVideoTrackIndex = mMediaMuxer.addTrack(videoFormat); startMuxerIfReady(); } } public void addAudioTrack(MediaFormat audioFormat) { if (mMediaMuxer != null) { mAudioTrackIndex = mMediaMuxer.addTrack(audioFormat); startMuxerIfReady(); } } public void writeVideoData(ByteBuffer byteBuffer, MediaCodec.BufferInfo bufferInfo) { if (mMediaMuxer != null && mVideoTrackIndex != -1) { mMediaMuxer.writeSampleData(mVideoTrackIndex, byteBuffer, bufferInfo); } } public void writeAudioData(ByteBuffer byteBuffer, MediaCodec.BufferInfo bufferInfo) { if (mMediaMuxer != null && mAudioTrackIndex != -1) { mMediaMuxer.writeSampleData(mAudioTrackIndex, byteBuffer, bufferInfo); } } public void releaseMuxer() { if (mMediaMuxer != null) { mMediaMuxer.stop(); mMediaMuxer.release(); mMediaMuxer = null; mVideoTrackIndex = -1; mAudioTrackIndex = -1; mMuxerStarted = false; } } private void startMuxerIfReady() { if (mVideoTrackIndex != -1 && mAudioTrackIndex != -1 && !mMuxerStarted) { mMediaMuxer.start(); mMuxerStarted = true; } } } ``` 在这个示例代码中,我们创建了一个MediaMuxerHelper类,该类包含了一些方法来添加音视频轨道,写入音视频数据,释放MediaMuxer对象等。在addVideoTrack()和addAudioTrack()方法中,我们分别添加了视频和音频轨道。在writeVideoData()和writeAudioData()方法中,我们将音视频数据写入轨道。 请注意,我们在添加完所有轨道后,才开始启动MediaMuxer对象。这是因为我们需要确保所有轨道都已添加,才能开始合并音视频文件。在释放MediaMuxer对象时,我们需要停止并释放MediaMuxer对象,并重置所有轨道索引和状态。 这是一个简单的示例,你可以根据你的需要进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值