css
主页 > 网页 > css >

WebRTC记录音视频流(web技术分享)

2022-02-24 | 秩名 | 点击:

一、监听开始事件

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

document.querySelector('button#start').addEventListener('click', async () => {

 

    document.querySelector('button#start').disabled = true;

 

    const constraints = {

 

        audio: {},

 

        video: {

 

            width: 1280, height: 720

 

        }

 

    };

 

    await init(constraints);

 

});

二、获取音视频轨道

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

async function init(constraints) {

 

    try {

 

        const stream = await navigator.mediaDevices.getUserMedia(constraints);

 

        handleSuccess(stream);

 

    } catch (e) {

 

        console.error('navigator.getUserMedia error:', e);

 

    }

 

}

1

2

3

4

5

6

7

8

9

10

11

function handleSuccess(stream) {

 

    recordButton.disabled = false;

 

    window.stream = stream;

 

    const gumVideo = document.querySelector('video#gum');

 

    gumVideo.srcObject = stream;

 

}

三、录制媒体流

这在四种情况下发生:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

let mediaRecorder;

 

const recordButton = document.querySelector('button#record');

 

 

 

recordButton.addEventListener('click', () => {

 

    if (recordButton.textContent === '开始记录') {

 

        startRecording();

 

    } else {

 

        stopRecording();

 

        recordButton.textContent = '开始记录';

 

        playButton.disabled = false;

 

    }

 

});

 

 

 

function startRecording() {

 

    recordedBlobs = [];

 

    try {

 

        mediaRecorder = new MediaRecorder(window.stream);

 

    } catch (e) {

 

        console.error('创建MediaRecorder时异常:', e);

 

    }

 

    recordButton.textContent = '停止记录';

 

    playButton.disabled = true;

 

    mediaRecorder.ondataavailable = handleDataAvailable;

 

    mediaRecorder.start();

 

}

 

 

 

function stopRecording() {

 

    mediaRecorder.stop();

 

}

 

 

 

function handleDataAvailable(event) {

 

    if (event.data && event.data.size > 0) {

 

        recordedBlobs.push(event.data);

 

    }

 

}

四、播放媒体流

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

let recordedBlobs;

 

const recordedVideo = document.querySelector('video#recorded');

 

const playButton = document.querySelector('button#play');

 

 

 

playButton.addEventListener('click', () => {

 

    const superBuffer = new Blob(recordedBlobs, { type: 'video/webm' });

 

    recordedVideo.src = null;

 

    recordedVideo.srcObject = null;

 

    recordedVideo.src = window.URL.createObjectURL(superBuffer);

 

    recordedVideo.controls = true;

 

    recordedVideo.play();

 

});

HTML:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

<link rel="stylesheet" href="./index.css">

 

 

 

<video id="gum" autoplay></video>

 

<video id="recorded"></video>

 

<div>

 

    <button id="start">开始</button>

 

    <button id="record" disabled>开始记录</button>

 

    <button id="play" disabled>Play</button>

 

</div>

 

 

 

<script src="./index.js"></script>

CSS:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

button {

 

    margin: 0 3px 10px 0;

 

    padding-left: 2px;

 

    padding-right: 2px;

 

    width: 99px;

 

}

 

   

 

button:last-of-type {

 

    margin: 0;

 

}

 

   

 

video {

 

    vertical-align: top;

 

    --width: 25vw;

 

    width: var(--width);

 

    height: calc(var(--width) * 0.5625);

 

}

 

   

 

video:last-of-type {

 

    margin: 0 0 20px 0;

 

}

 

   

 

video#gumVideo {

 

    margin: 0 20px 20px 0;

 

}

JavaScript:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

let mediaRecorder;

 

let recordedBlobs;

 

 

 

const recordedVideo = document.querySelector('video#recorded');

 

const recordButton = document.querySelector('button#record');

 

recordButton.addEventListener('click', () => {

 

    if (recordButton.textContent === '开始记录') {

 

        startRecording();

 

    } else {

 

        stopRecording();

 

        recordButton.textContent = '开始记录';

 

        playButton.disabled = false;

 

    }

 

});

 

 

 

const playButton = document.querySelector('button#play');

 

playButton.addEventListener('click', () => {

 

    const superBuffer = new Blob(recordedBlobs, { type: 'video/webm' });

 

    recordedVideo.src = null;

 

    recordedVideo.srcObject = null;

 

    recordedVideo.src = window.URL.createObjectURL(superBuffer);

 

    recordedVideo.controls = true;

 

    recordedVideo.play();

 

});

 

 

 

function handleDataAvailable(event) {

 

    if (event.data && event.data.size > 0) {

 

        recordedBlobs.push(event.data);

 

    }

 

}

 

 

 

function startRecording() {

 

    recordedBlobs = [];

 

    try {

 

        mediaRecorder = new MediaRecorder(window.stream);

 

    } catch (e) {

 

        console.error('创建MediaRecorder时异常:', e);

 

    }

 

    recordButton.textContent = '停止记录';

 

    playButton.disabled = true;

 

    mediaRecorder.ondataavailable = handleDataAvailable;

 

    mediaRecorder.start();

 

}

 

 

 

function stopRecording() {

 

    mediaRecorder.stop();

 

}

 

 

 

function handleSuccess(stream) {

 

    recordButton.disabled = false;

 

    window.stream = stream;

 

    const gumVideo = document.querySelector('video#gum');

 

    gumVideo.srcObject = stream;

 

}

 

 

 

async function init(constraints) {

 

    try {

 

        const stream = await navigator.mediaDevices.getUserMedia(constraints);

 

        handleSuccess(stream);

 

    } catch (e) {

 

        console.error('navigator.getUserMedia error:', e);

 

    }

 

}

 

 

 

document.querySelector('button#start').addEventListener('click', async () => {

 

    document.querySelector('button#start').disabled = true;

 

    const constraints = {

 

        audio: {},

 

        video: {

 

            width: 1280, height: 720

 

        }

 

    };

 

    await init(constraints);

 

});

原文链接:https://www.jb51.net/css/812518.html
相关文章
最新更新