"Особенности записи звука нативными технологиями...

36
Особенности записи звука нативными технологиями браузеров Фёдор Котов, руководитель веб-разработки Penxy 1

Upload: moscowjs

Post on 16-Jul-2015

258 views

Category:

Software


1 download

TRANSCRIPT

Page 1: "Особенности записи звука нативными технологиями браузеров" — Федор Котов, MoscowJS 18

Особенности записи звука нативными технологиями браузеров

Фёдор Котов, руководитель веб-разработки Penxy

1

Page 2: "Особенности записи звука нативными технологиями браузеров" — Федор Котов, MoscowJS 18

Стартап, в команде 3 человека, зарабатываем

Инвестор из России, продукт с фокусом на США

О нас

2

Page 3: "Особенности записи звука нативными технологиями браузеров" — Федор Котов, MoscowJS 18

О бизнесе

3

✓ Эксперты озвучивают слайды

✓ Делятся Говорящими Слайдами с другими людьми

Page 4: "Особенности записи звука нативными технологиями браузеров" — Федор Котов, MoscowJS 18

4

Page 5: "Особенности записи звука нативными технологиями браузеров" — Федор Котов, MoscowJS 18

WebRTC5

Page 6: "Особенности записи звука нативными технологиями браузеров" — Федор Котов, MoscowJS 18

Темна, терниста и запутана:- несколько разных стандартов- _webkit_moz_ms все сделали по-разному

История WebRTC

6

Page 7: "Особенности записи звука нативными технологиями браузеров" — Федор Котов, MoscowJS 18

WebRTC - возможностиПозволяет соединить несколько клиентов напрямую и передавать между ними данные.

7

Page 8: "Особенности записи звука нативными технологиями браузеров" — Федор Котов, MoscowJS 18

- peer-to-peer connections- peer-to-peer Data API- SIP, stats, etc- Media Stream API Extensions

WebRTC - содержание

8

Page 9: "Особенности записи звука нативными технологиями браузеров" — Федор Котов, MoscowJS 18

- Видеоконференции- Передача файлов- Доступ к экрану- Игры- Редактирование звука в браузере

WebRTC - сферы применения

9

Без плагинов!

Page 10: "Особенности записи звука нативными технологиями браузеров" — Федор Котов, MoscowJS 18

Почему мы используем WebRTC

➔ Нужен только браузер!

➔ Не нужны Flash или Java

➔ Клиенты довольны

★ Полный Javascript вашего приложения.

10

Page 11: "Особенности записи звука нативными технологиями браузеров" — Федор Котов, MoscowJS 18

Запись аудио в браузере

11

Page 12: "Особенности записи звука нативными технологиями браузеров" — Федор Котов, MoscowJS 18

12

Нажал – работает

Page 13: "Особенности записи звука нативными технологиями браузеров" — Федор Котов, MoscowJS 18

13

Нажал – работает

Page 14: "Особенности записи звука нативными технологиями браузеров" — Федор Котов, MoscowJS 18

14

Нажал – работает

Page 15: "Особенности записи звука нативными технологиями браузеров" — Федор Котов, MoscowJS 18

Но обо всем по порядку

15

Page 16: "Особенности записи звука нативными технологиями браузеров" — Федор Котов, MoscowJS 18

WebRTC API Web Audio API

Media Stream APIмикрофонкамера

16

Page 17: "Особенности записи звука нативными технологиями браузеров" — Федор Котов, MoscowJS 18

Source Processing Destination

Поток звука

17

Page 18: "Особенности записи звука нативными технологиями браузеров" — Федор Котов, MoscowJS 18

Source Processing Destination

Поток звука

- Audio files (+ XHR, etc)- <audio>, <video> tags- MediaStream- (AudioMediaStreamTrack)

18

Page 19: "Особенности записи звука нативными технологиями браузеров" — Федор Котов, MoscowJS 18

Source Processing Destination

Поток звука

- Audio files (+ XHR, etc)- <audio>, <video> tags- MediaStream- (AudioMediaStreamTrack)

- Audio effects- Spliting, Merging- Spatialization- Compressing- etc

19

Page 20: "Особенности записи звука нативными технологиями браузеров" — Федор Котов, MoscowJS 18

Source Processing Destination

Поток звука

- Audio files (+ XHR, etc)- <audio>, <video> tags- MediaStream- (AudioMediaStreamTrack)

- Audio effects- Spliting, Merging- Spatialization- Compressing- etc

- Device (speakers)- MediaStream- “Record” audio node- XHR, Websockets,

etc

20

Page 21: "Особенности записи звука нативными технологиями браузеров" — Федор Котов, MoscowJS 18

Destination Buffer, file, etc Server

Передача аудио на сервер

21

Page 22: "Особенности записи звука нативными технологиями браузеров" — Федор Котов, MoscowJS 18

Destination Buffer, file, etc Server

Передача аудио на сервер

~ 170 KiB/s~ 600 MiB в час~ 1 GiB RAM в час

WAV 44.1Kz, 16 bit depth, stereo

22

Page 23: "Особенности записи звука нативными технологиями браузеров" — Федор Котов, MoscowJS 18

❏ Запись занимает много места на диске

❏ Запись аудио больше часа невозможна (не в Firefox)

Проблема

23

Page 24: "Особенности записи звука нативными технологиями браузеров" — Федор Котов, MoscowJS 18

- mono audio- ухудшить качество- записывать кусочками - ?

Как уменьшить размер?

24

Page 25: "Особенности записи звука нативными технологиями браузеров" — Федор Котов, MoscowJS 18

Сжимать на клиенте

Решение

на лету

25

Page 26: "Особенности записи звука нативными технологиями браузеров" — Федор Котов, MoscowJS 18

Какой формат выбрать?

26

Page 27: "Особенности записи звука нативными технологиями браузеров" — Федор Котов, MoscowJS 18

OGG MP3

Аудио форматы

27

Firefox

RecordRTC из набора WebRTC experiments

Firefox, Chrome, Safari

LAME, скомпилированную emscripten

Page 28: "Особенности записи звука нативными технологиями браузеров" — Федор Котов, MoscowJS 18

★ LAME - это просто!

➔ Initialize - на старте записи

➔ Record - кодируем каждый аудио-буфер

➔ Finish - собираем mp3-файл

28

Пишем Recorder

Page 29: "Особенности записи звука нативными технологиями браузеров" — Федор Котов, MoscowJS 18

MP3 recorder, init

29

mp3codec = Lame.init();

Lame.set_mode(mp3codec, 3); // monoLame.set_num_channels(mp3codec, 1);Lame.set_out_samplerate(mp3codec, 44100);Lame.set_in_samplerate(mp3codec, 44100);Lame.set_bitrate(mp3codec, 128);

Lame.init_params(mp3codec);

Page 30: "Особенности записи звука нативными технологиями браузеров" — Федор Котов, MoscowJS 18

MP3 recorder, record

30

audioNode.onaudioprocess = function(e) { var channelLeft;

channelLeft = e.inputBuffer.getChannelData(0);

encoderMp3Worker.postMessage({ command: 'encode', buf: channelLeft });};

Page 31: "Особенности записи звука нативными технологиями браузеров" — Федор Котов, MoscowJS 18

MP3 recorder, encode

31

var mp3data = Lame.encode_buffer_ieee_float( mp3codec,

e.data.buf, e.data.buf);

recBuffers.push(mp3data.data);recLength += mp3data.data.length;

Page 32: "Особенности записи звука нативными технологиями браузеров" — Федор Котов, MoscowJS 18

MP3 recorder, finish

32

var mp3data = Lame.encode_flush(mp3codec);

recBuffers.push(mp3data.data);recLength += mp3data.data.length;

var buffer = mergeBuffers(recBuffers, recLength);var data = new Uint8Array(buffer);var audioBlob = new Blob([data], { type: "audio/mp3"});// send audioBlob somewhere

Page 33: "Особенности записи звука нативными технологиями браузеров" — Федор Котов, MoscowJS 18

~ 10 KiB/s

~ 30 MiB/час

~ 40 MiB RAM/час

★ ogg - даже лучше

Результат

33

~ 170 KiB/s

~ 600 MiB/час

~ 1 Gib RAM/час

Было Стало

Page 34: "Особенности записи звука нативными технологиями браузеров" — Федор Котов, MoscowJS 18

Теперь, можно записывать длинные аудио-файлы!

34

Page 35: "Особенности записи звука нативными технологиями браузеров" — Федор Котов, MoscowJS 18

➔ использовать Audio Web Workers!

➔ сохранять файлы в локальное хранилище

или отдавать юзеру

➔ стримить на сервер или отдавать

кусочками

Советы

35

Page 36: "Особенности записи звука нативными технологиями браузеров" — Федор Котов, MoscowJS 18

Фёдор Котов

Руководитель веб-разработки[email protected]

36

http://bit.ly/moscow-js-audio