“超越”高考许愿机上线,祝大家“超越”录取线

一位程序员参加杨超越编程大赛,创作了一款许愿机应用,利用网络摄像头直播打印机,接收全球用户的许愿内容并实时展示。项目采用AgoraWebRTCSDK实现音视频互动,部署于AWS,展现了RTC技术在创意项目中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前些日子,我司做了个小的内部分享活动,无心插柳,没想到还有个意外收获。

我司有位小哥哥,参加了前两个月的 “杨超越编程大赛”,提交了一份作品,作品思路清奇,“拼”了一台许愿机。

许愿是否灵验,我们也不知道,我们也不敢问。但,万一实现了呢?

本着“传播 RTC 技术”的原则,我们让他将开发过程也写了下来,一并分享出来。

不论你身边是否有高考的小盆友,都欢迎你来领取这份端午前的锦(yu)鲤(le)。

注:看到最后有惊喜!!


朋友们可以直接去 https://ycy.dev 体验,或点击「阅读原文」(PC 端显示效果更好)。注意,有BGM,耳机党预警。

github:https://github.com/scaret/ycy-wishing-machine

应用介绍

灵感来自于超越的幸运A体质。通过向超越许愿的形式来分享超越的幸运值。 该项目通过网络摄像头直播一个放在PO主家的打印机。你可以通过H5页面向打印机发送许愿内容。许愿内容会通过网页直播实时传回,并被全世界看到。许愿纸攒到一定程度会寄给超越。

另外,最近买了个小爱同学,打算也放入摄像头范围,加上音视频互通能力,就可以通过实时音视频远程操控小爱同学啦。

线上环境

因为是个人项目,也不好意思用公司机器,于是蹭了AWS Free Tier,使用了AWS日本的Ubuntu 16.04,micro类型的实例。

640?wx_fmt=png

基本上服务器只是起到托管页面的作用,由于嫌备案麻烦而放在日本,还比较慢。其他设置如下:

  • nginx/1.10.3

  • node.js/10.15.3

  • pm2 3.5.0

  • express/4.16.4

域名是花650块重金从Google买的。证书是免费的LetEncrypt证书。咕咕机是去年买的在家吃灰了一年翻出来的。

640?wx_fmt=png

实时音视频技术用的当然是Agora WebRTC SDK啦。主播端和观众端都使用的是Web。

WebRTC主播端

主播端比较简单,就是一个发送端网页。获取摄像头权限后发动到指定频道即可。

为了兼容不同设备的观众端的Codec,所以主播端发送H264、VP8两路视频。两路视频都是720P的设置。

var codecs = ["h264", "vp8"];	
codecs.forEach(function(codec){	
    var client = AgoraRTC.createClient({mode: "rtc", codec: codec});	
    client.init("<appId>", function () {	
        client.join(null, cname + "_" + codec, 8888, function(){	
            console.log("Client joined");	
            const spec = {video: true, audio: true};	
            const localStream = AgoraRTC.createStream(spec);	
            localStream.setVideoProfile("720p_2");	
            console.log("spec", spec);	
            localStream.init(function(){	
                window.vt = localStream.stream.getVideoTracks()[0]	
                console.log("LocalStream Inited");	
                client.publish(localStream);	
                client.on("stream-published", function(){	
                    console.log("stream published");	
                    localStream.play("local-container");	
                });	
            });	
        });	
    });	
});

之后我额外做了混音功能,在频道内不间断地播放【卡路里之歌】。

  1. localStream.audioMixing.inEarMonitoring = "NONE";

  2. if (codec === "vp8"){

  3. localStream.startAudioMixing({

  4. filePath: '/music/kll.mp3',

  5. replace: true,

  6. playTime: 0,

  7. loop: true

  8. });

  9. }else{

  10. localStream.startAudioMixing({

  11. filePath: '/music/pickme.mp4',

  12. replace: true,

  13. playTime: 0,

  14. loop: true

  15. });

  16. }

WebRTC观众端

观众端首先会侦测当前环境支持的视频编码格式。 由于安卓设备的H264实现比较不一致,在这里是VP8优先,在不支持VP8的环境中Fallback到H264视频编码。

  1. var cname = "<cname>";

  2. var codec = "vp8";

  3. AgoraRTC.getSupportedCodec().then(function(codecs){

  4. console.log("codecs", codecs);

  5. if (codecs.video.indexOf("VP8" !== -1)){

  6. codec = "vp8";

  7. }else{

  8. codec = "h264";

  9. }

  10. }).catch(function(e){

  11. console.error(e);

  12. codec = "h264";

  13. });

在Chrome、Safari浏览器中,有一个叫做【自动播放策略】的东西。简单地说,浏览器会阻止媒体自动播放声音。 解决的方法也很简单,在播放之前额外设置了一个确认框,引导用于点击确认时,允许视频的播放。

  1. var nickname = window.localStorage && localStorage.getItem("nickname");

  2. function updateNickname(){

  3. bootbox.prompt({

  4. closeButton: false,

  5. title: "你的名字是?",

  6. callback: function(result){

  7. if (result){

  8. nickname = result;

  9. window.localStorage && localStorage.setItem("nickname", nickname);

  10. ConnectIO();

  11. }else{

  12. updateNickname();

  13. }

  14. elem.play();

  15. }

  16. });

  17. }

iOS的微信也支持WebRTC了!真是普天同庆。

其他的一些零碎

还有一些零零碎碎的工作,包括:

  • 分享页面的优化

  • 在线人数统计

  • 连接咕咕机打印

  • 打印太多导致纸张翻车,需要时常捋一捋

相对来说这个应用还是蛮简单的。

希望大家给我点赞!

640?wx_fmt=png

640?wx_fmt=gif

640?wx_fmt=gif

下面重点来了!!

欢迎在下方留言,说说你当年的高考第一志愿是什么?现在你从事的工作是什么?

不论你当年的志愿实现与否,我们都将在 6 月 10 日,从留言中挑选出 5 位送上一份端午节小礼物

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值