Skip to content

Commit

Permalink
2.19.4
Browse files Browse the repository at this point in the history
  • Loading branch information
quinton-ashley committed Feb 4, 2025
1 parent 1d27ba6 commit f4fbdcd
Show file tree
Hide file tree
Showing 5 changed files with 42 additions and 73 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "q5",
"version": "2.19.3",
"version": "2.19.4",
"description": "A sequel to p5.js that's optimized for interactive art",
"author": "quinton-ashley",
"contributors": [
Expand Down
11 changes: 8 additions & 3 deletions q5.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2645,15 +2645,20 @@ function draw() {
/** 🎞️
* Creates a recorder. Simply hit record to start recording!
*
* `quality` is set to "high" by default.
* `format` is set to "H.264" by default. Encoding in "VP9" may not
* be possible on some devices.
*
* `format` is set automatically based on the height of the canvas.
* `bitrate` is a number in megabits per second (mbps). Its default
* value is determined by the height of the canvas. Increasing the
* bitrate will increase the quality and file size of the recording.
*
* These properties can be set via the recorder UI or programmatically.
* @returns {HTMLElement} a recorder, q5 DOM element
* @example
createCanvas(200);
createRecorder();
let rec = createRecorder();
rec.bitrate = 10;
function draw() {
circle(mouseX, randomY(), 10);
Expand Down
50 changes: 16 additions & 34 deletions q5.js
Original file line number Diff line number Diff line change
Expand Up @@ -3441,7 +3441,7 @@ Q5.PerlinNoise = class extends Q5.Noise {
}
};
Q5.modules.record = ($, q) => {
let rec, btn0, btn1, timer, formatSelect, qualitySelect;
let rec, btn0, btn1, timer, formatSelect, bitrateInput;

$.recording = false;

Expand Down Expand Up @@ -3476,6 +3476,7 @@ Q5.modules.record = ($, q) => {
.rec button,
.rec select,
.rec input,
.rec .record-timer {
font-family: sans-serif;
font-size: 14px;
Expand Down Expand Up @@ -3541,43 +3542,29 @@ Q5.modules.record = ($, q) => {
formatSelect.title = 'Video Format';
rec.append(formatSelect);

let qMult = {
min: 0.1,
low: 0.25,
mid: 0.5,
high: 0.75,
ultra: 0.9,
max: 1
};

qualitySelect = $.createSelect('quality');
for (let name in qMult) {
qualitySelect.option(name, qMult[name]);
}
qualitySelect.title = 'Video Quality';
rec.append(qualitySelect);
bitrateInput = $.createInput();
bitrateInput.title = 'Video Bitrate';
bitrateInput.style.width = '48px';
rec.append(bitrateInput);

rec.encoderSettings = {};

function changeFormat() {
rec.encoderSettings.mimeType = formatSelect.value;
}

function changeQuality() {
rec.encoderSettings.videoBitsPerSecond = maxVideoBitRate * qualitySelect.value;
function changeBitrate() {
rec.encoderSettings.videoBitsPerSecond = 1000000 * bitrateInput.value;
}

formatSelect.addEventListener('change', changeFormat);
qualitySelect.addEventListener('change', changeQuality);
bitrateInput.addEventListener('change', changeBitrate);

Object.defineProperty(rec, 'quality', {
get: () => qualitySelect.selected,
Object.defineProperty(rec, 'bitrate', {
get: () => bitrateInput.value,
set: (v) => {
v = v.toLowerCase();
if (qMult[v]) {
qualitySelect.selected = v;
changeQuality();
}
bitrateInput.value = v;
changeBitrate();
}
});

Expand All @@ -3592,15 +3579,10 @@ Q5.modules.record = ($, q) => {
}
});

let h = $.canvas.height;

if (h >= 1440 && rec.formats.VP9) rec.format = 'VP9';
else rec.format = 'H.264';
rec.format = 'H.264';

let maxVideoBitRate =
(h >= 4320 ? 128 : h >= 2160 ? 75 : h >= 1440 ? 36 : h >= 1080 ? 28 : h >= 720 ? 22 : 16) * 1000000;

rec.quality = 'high';
let h = $.canvas.height;
rec.bitrate = h >= 4320 ? 128 : h >= 2160 ? 75 : h >= 1440 ? 50 : h >= 1080 ? 32 : h >= 720 ? 26 : 16;

btn0.addEventListener('click', () => {
if (!$.recording) start();
Expand Down
2 changes: 1 addition & 1 deletion q5.min.js

Large diffs are not rendered by default.

50 changes: 16 additions & 34 deletions src/q5-record.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
Q5.modules.record = ($, q) => {
let rec, btn0, btn1, timer, formatSelect, qualitySelect;
let rec, btn0, btn1, timer, formatSelect, bitrateInput;

$.recording = false;

Expand Down Expand Up @@ -34,6 +34,7 @@ Q5.modules.record = ($, q) => {
.rec button,
.rec select,
.rec input,
.rec .record-timer {
font-family: sans-serif;
font-size: 14px;
Expand Down Expand Up @@ -99,43 +100,29 @@ Q5.modules.record = ($, q) => {
formatSelect.title = 'Video Format';
rec.append(formatSelect);

let qMult = {
min: 0.1,
low: 0.25,
mid: 0.5,
high: 0.75,
ultra: 0.9,
max: 1
};

qualitySelect = $.createSelect('quality');
for (let name in qMult) {
qualitySelect.option(name, qMult[name]);
}
qualitySelect.title = 'Video Quality';
rec.append(qualitySelect);
bitrateInput = $.createInput();
bitrateInput.title = 'Video Bitrate';
bitrateInput.style.width = '48px';
rec.append(bitrateInput);

rec.encoderSettings = {};

function changeFormat() {
rec.encoderSettings.mimeType = formatSelect.value;
}

function changeQuality() {
rec.encoderSettings.videoBitsPerSecond = maxVideoBitRate * qualitySelect.value;
function changeBitrate() {
rec.encoderSettings.videoBitsPerSecond = 1000000 * bitrateInput.value;
}

formatSelect.addEventListener('change', changeFormat);
qualitySelect.addEventListener('change', changeQuality);
bitrateInput.addEventListener('change', changeBitrate);

Object.defineProperty(rec, 'quality', {
get: () => qualitySelect.selected,
Object.defineProperty(rec, 'bitrate', {
get: () => bitrateInput.value,
set: (v) => {
v = v.toLowerCase();
if (qMult[v]) {
qualitySelect.selected = v;
changeQuality();
}
bitrateInput.value = v;
changeBitrate();
}
});

Expand All @@ -150,15 +137,10 @@ Q5.modules.record = ($, q) => {
}
});

let h = $.canvas.height;

if (h >= 1440 && rec.formats.VP9) rec.format = 'VP9';
else rec.format = 'H.264';
rec.format = 'H.264';

let maxVideoBitRate =
(h >= 4320 ? 128 : h >= 2160 ? 75 : h >= 1440 ? 36 : h >= 1080 ? 28 : h >= 720 ? 22 : 16) * 1000000;

rec.quality = 'high';
let h = $.canvas.height;
rec.bitrate = h >= 4320 ? 128 : h >= 2160 ? 75 : h >= 1440 ? 50 : h >= 1080 ? 32 : h >= 720 ? 26 : 16;

btn0.addEventListener('click', () => {
if (!$.recording) start();
Expand Down

0 comments on commit f4fbdcd

Please sign in to comment.