五大视频功能,开发者无需再从零开始构建
最近我和三位软件开发人员进行了一次圆桌讨论,我们谈到了千禧一代和Z世代在社交媒体上的广泛参与。这引发了一场关于构建和扩展社交应用所需条件的深入技术探讨,大家一致认为,最具挑战性的问题是时间和可扩展性。
就时间而言,许多开发者和公司创始人提出的关键问题都集中在以下几个方面:完成以下任务需要多长时间?
- 进入市场。
- 在现有产品功能的基础上,开发视频功能。
- 打造未来的 Vine 或 TikTok。
本文将向您展示如何使用 Cloudinary 高效地创建视频功能。您会惊讶于工作效率的提升。
上传
首要的视频功能始终是让您的用户能够上传视频到您的应用——可以一次上传一个,也可以一次上传多个。您可以通过集成 Cloudinary 的上传组件来实现这一点,该组件提供了一个可自定义外观的 UI,支持从多种数据源上传视频。集成过程只需几段代码:
<button id="upload_widget" class="cloudinary-button">Upload files</button>
<script src="https://upload-widget.cloudinary.com/global/all.js" type="text/javascript"></script>
<script type="text/javascript">
var myWidget = cloudinary.createUploadWidget({
cloudName: 'my_cloud_name',
uploadPreset: 'my_preset'}, (error, result) => {
if (!error && result && result.event === "success") {
console.log('Done! Here is the image info: ', result.info);
}
}
)
document.getElementById("upload_widget").addEventListener("click", function(){
myWidget.open();
}, false);
</script>
index.html
压缩和优化
随着科技进步,设备上的视频文件大小呈指数级增长。然而,所有这些丰富的内容也带来了挑战,尤其是在加载速度方面。当然,您的观众希望两全其美:既能观看高质量视频,又能以更少的数据流量流畅播放。
Cloudinary 为您提供压缩和优化技术。例如,q将上传的名为“video”的 MP4 视频的质量()降低dog到 50,文件大小将从原始的9.8 MB 缩小到 1.1 MB。
压缩前:
https://res.cloudinary.com/demo/video/upload/dog.mp4
压缩后: https://res.cloudinary.com/demo/video/upload/q_50/dog.mp4
您可以将该q参数(代表质量转换)设置为 0 到 100 之间的值。
或者,设置q为auto( q_auto) 以启用自动质量编码。以下是相关选项:
q_auto:在文件大小和视觉质量之间取得最佳平衡。默认情况下,此设置与相同q_auto:good。q_auto:best采用不那么激进的算法,生成更大的文件,但可能具有更高的视觉质量。q_auto:good确保文件大小相对较小,同时保持较高的视觉质量,例如,适用于展示高质量视频的素材网站。q_auto:eco:采用更激进的算法,生成更小的文件,但视觉质量略有降低,例如,对于流量大的热门网站和社交网络。q_auto:low:采用最激进的算法,生成最小但视觉质量低的文件,例如,对于通过缩略图预览视频链接到高质量视频的网站。
流媒体
新冠疫情在全球范围内推动了远程活动的蓬勃发展。通过 Instagram 等平台进行视频直播是其中的关键因素。想要快速为您的应用启用直播功能?Cloudinary 是您的理想之选。其端到端的视频流媒体解决方案同时支持 WebRTC 和 RTMP 协议。此外,通过专用的 JavaScript 库实现的实时自适应比特率流媒体输出还具备丰富的特效和变换效果。
以下是HTML和JavaScript代码:
<link href="./styles.css" rel="stylesheet" type="text/css">
<script src="https://unpkg.com/@cloudinary/js-streaming/dist/js-streaming.js"></script>
<div class="container wrapper">
<h1>Example of Live Streaming With Cloudinary</h1>
<div class="video-wrapper">
<video class="video" id="video" autoPlay muted="muted" playsInline></video>
</div>
<div class="center">
<div class="center-text">
<button id="viewbtn" onclick="view();">Show camera</button>
<button id="hidebtn" onclick="hide();">Hide camera</button>
</div>
<div class="center-text">
<button id="initbtn" onclick="initialize();">Initialize stream</button>
<button disabled id="startbtn" onclick="start();">Start stream</button>
<button disabled id="stopbtn" onclick="stop();">Stop stream</button>
</div>
<div class="ui">
<p>Status: <span id="status">Click Initialize stream to begin</span></p>
<p>Public ID: <span id="publicid"></span></p>
<p>File URL: <a id="file_url" target="_blank"></a></p>
<p>Stream URL: <a id="stream_url" target="_blank"></a></p>
</div>
</div>
</div>
<script src="./index.js"></script>
index.html
const {initLiveStream, attachCamera, detachCamera} = cloudinaryJsStreaming;
const CLOUD_NAME = '<your-cloud-name>';
const UPLOAD_PRESET = '<your-upload-preset>';
let liveStream, publicId, url;
function setText(id, text) {
document.getElementById(id).innerHTML = text;
}
function setStatus(status) {
setText("status", status);
}
function toggleButton(id, enabled) {
document.getElementById(id).disabled = !enabled;
}
function toggleBtns(init = false, start = false, stop = false) {
toggleButton("initbtn", init);
toggleButton("startbtn", start);
toggleButton("stopbtn", stop);
}
function setUrl(url) {
const fileUrl = url + '.mp4';
const streamUrl = url + '.m3u8';
const file_link = document.getElementById('file_url');
const stream_link = document.getElementById('stream_url');
file_link.href = fileUrl;
file_link.innerText = fileUrl;
stream_link.href = streamUrl;
stream_link.innerText = streamUrl;
}
function view(){
attachCamera(document.getElementById("video")).then(c=>{
console.log(c);
})
}
function hide(){
detachCamera(document.getElementById("video")).then(c=>{
console.log(c);
})
}
function start() {
setStatus("starting...");
toggleBtns();
liveStream.start(publicId);
}
function stop() {
setStatus("stopping...");
toggleBtns();
liveStream.stop();
}
// Call initLiveStream with the configuration parameters:
function initialize() {
setStatus("initializing...");
toggleBtns();
initLiveStream({
cloudName: CLOUD_NAME,
uploadPreset: UPLOAD_PRESET,
debug: "all",
hlsTarget: true,
fileTarget: true,
events: {
start: function (args) {
setStatus("started");
document.getElementById("video").className = "video recording";
toggleBtns(false, false, true);
},
stop: function (args) {
setStatus("stopped");
document.getElementById("video").className = "video";
toggleBtns(true, false, false);
},
error: function (error) {
setStatus("error: " + error);
toggleBtns(true, false, false);
},
local_stream: function (stream) {
setStatus("local stream");
// Attach the stream to a video element:
liveStream.attach(document.getElementById("video"), stream);
}
}
}).then(result => {
// keep handle to instance to start/stop streaming
liveStream = result;
// Extract the public ID and URL from the result (publish the URL for the stream):
publicId = result.response.public_id;
url = 'https://res.cloudinary.com/'+CLOUD_NAME+'/video/upload/' + publicId;
setStatus("initialized");
setText("publicid", publicId);
setUrl(url);
toggleBtns(false, true, false);
});
}
index.js
从 GitHub复制styles.css 文件。
转变
从 Instagram、Snapchat 和 TikTok 上的视频片段可以看出,你可以通过多种方式转换视频。Cloudinary 提供了许多工具和技巧来实现这一点,尤其值得一提的是以下几点:
将视频转换为动画 GIF,只需将返回 URL 的文件扩展名更改为.gif 即可。用这个视频.gif试试看。
- 将视频转换为音频,只需将文件格式(或扩展名)设置为支持的音频格式之一即可。您可以亲自体验一下:只需更改文件扩展名,即可将上面的 MP4 文件转换为 MP3 文件。
text使用 URL 中的overlay 参数属性(例如`l_text:arial_60:Cool%20Video/eo_5.0,fl_layer_apply,g_south,so_2.0,y_80/dog.mp4`)向视频添加文本叠加层l_text:,后跟字体名称和大小(用下划线分隔)、冒号和要显示的文本字符串。例如,要以 Arial 字体、40 像素大小叠加文本字符串“Sample Video”,请按以下方式编写代码:l_text:arial_40:Sample Video`
https://res.cloudinary.com/demo/video/upload/l_text :arial_60:Cool%20Video/eo_5.0,fl_layer_apply,g_south,so_2.0,y_80/dog.mp4`
- 通过在 URL 中添加 overlay 参数(
l)和之前上传的 PNG 图片的公共 ID(例如,l_watermark对于公共 ID 为 1 的图片),即可向视频添加图像叠加层watermark。您可以像设置图片叠加层一样,使用 width、height、x、y 和 gravity 参数来指定叠加层的尺寸和位置。更多详情,请参阅文章“向图片添加水印、版权信息、徽章和文字叠加层”。
此外,您还可以通过组合三个偏移参数来指定何时显示叠加层。有关详细信息,请参阅视频裁剪文档。
您还可以像处理上传到 Cloudinary 的其他图像一样,进一步转换叠加层。例如,您可以将名为 `<overlay_name>` 的 PNG 图像叠加层添加cloudinary_icon_white到名为 `<video_name>` 的视频中dog.mp4,并在视频播放到 6.5 秒到 10 秒之间显示该叠加层。要将该叠加层转换为水印,请使用o参数将不透明度降低到 50%,并使用效果将亮度提高到 100 e_brightness。
- 使用 `overlay-video` 参数(
l_video:在 URL 中)和之前上传视频的公开 ID(例如,l_video:dog公开 ID 为 `video.id` 的视频)将其他视频添加为叠加层dog。像设置图片尺寸和位置一样,使用 `width`、`height`、`x`、`y` 和 `gravity` 参数指定视频叠加层的尺寸和位置。详情请参阅相关文档。
要指定何时显示视频叠加层,请组合使用三个偏移参数。有关详细信息,请参阅视频裁剪文档。您可以像处理上传到 Cloudinary 的任何其他视频一样,进一步转换叠加层。
不妨自己尝试一下:dog在同一个视频(也命名为dog)中添加一个名为的视频叠加层,并在视频的 4.5 秒到 8 秒之间显示该视频叠加层。将叠加层旋转 90 度,重力设置为“东”,宽度设置为 200 像素。
级联
将多个视频拼接成一个视频是娱乐和教学视频中常用的方法。拼接短视频最简单的方法是设置以下两个参数:
- overlay-video 参数(
l_video:在 URL 中),用于指定 Cloudinary 上上传的另一个视频的名称。 - splice-flag 参数(
fl_splice在 URL 中)指定将视频连接到容器视频上,而不是作为叠加层添加。
为了演示,请将名为“video”dog和名为“video_name”的视频设置kitten_fighting为宽度为 300 像素,高度为 200 像素。
注意:您可以自定义视频之间的过渡效果。示例:https
://res.cloudinary.com/demo/video/upload/du_5.0/c_scale,h_200,w_300/l_video:dog/c_scale,h_200,w_300/du_5.0/e_transition,l_video:transition1/fl_layer_apply/fl_layer_apply/kitten_fighting.mp4
该e_transition参数指定视频叠加层l_video:transition1作为基础视频和第二个视频之间的过渡效果。
最后想说的话
为了提高效率和减轻负担,请务必利用高效的工具大规模处理繁琐或重复性任务。这样,您就可以专注于集思广益,构思业务逻辑,并开发需要创造力的功能和应用程序。
有关 Cloudinary 视频功能的更多详细信息,请参阅文档。
文章来源:https://dev.to/unicodeveloper/ Five-video-features-developers-no-longer-need-to-build-from-scratch-2egj