首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Qt6 QML 中渲染自定义视频帧的改进 2023-05-30 更新

Qt6 QML 中渲染自定义视频帧的改进 2023-05-30 更新

作者头像
我与梦想有个约会
发布于 2023-10-21 07:40:14
发布于 2023-10-21 07:40:14
1.5K20
代码可运行
举报
文章被收录于专栏:jiajia_dengjiajia_deng
运行总次数:0
代码可运行

场景介绍

在网络会议、双人视频通话等场景时,将手机横屏、竖屏放置场景下,实现本地和远端都可以看到正常的画面效果。

效果演示

当左边手机进行旋转时,即进行横屏推流,右边手机的小画面订阅到的远端流,动态调整view进行适配,避免出现黑边;

当两端手机都进行旋转时,两端都进行横屏推流,各自订阅的远端流画面进行动态调整view;

无论如何旋转手机,两端看到的画面都是正的。

(大画面:本地摄像头; 小画面:远端流)

实现逻辑

推流端

1)开启 SDK 重力感应,默认就是开启的,如果关闭了,请调用接口打开 SDK 重力感应

2)监听手机旋转角度

3)根据不同的旋转角度,设置视频编码参数,即横屏/竖屏编码

4)发送 SEI 消息,告知房间内其他用户,当前是横屏还是竖屏

5)根据不同的旋转角度,旋转自己订阅的远端流的画面

6)根据不同的旋转角度,来调整 activity 为横屏或竖屏

拉流端

1)收到远端用户的第一帧视频,根据宽高数据,调整渲染远端流的 view 宽高,避免小窗口出现黑边

2)当推流端旋转手机时,可以收到发送的 SEI 消息,根据传递过来的横屏或竖屏,调整渲染远端流的 view 宽高,避免出现黑边

代码逻辑

1)TRTC SDK 版本号

这里可以指定使用 9.5.11347 版本的 SDK,体验下效果。

SDK 发布日志历史:参考文档

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
com.tencent.liteav:LiteAVSDK_TRTC:9.5.11347

2)修改清单文件

android:configChanges 避免重新启动 activity

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<activity 
    android:name="com.tencent.trtc.videocall.VideoCallingActivity"
    android:configChanges="orientation|keyboard|layoutDirection|screenSize"
    android:screenOrientation="portrait"
    />

3)开启重力感应

setGSensorMode 设置重力感应接口,默认开启,默认值为 TRTCGSensorMode_UIAutoLayout

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mTRTCCloud.setGSensorMode(TRTCCloudDef.TRTC_GSENSOR_MODE_UIAUTOLAYOUT);

4)监听手机的旋转

当手机旋转时,如:90度、180度、270度时,需要将 activity 调整设置对应的 横屏或竖屏

使用 OrientationEventListener 实时监听手机的旋转角度

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 获取到手机旋转的角度,取四个方向:0、90、180、270度
 * @param orientation 0、90、180、270度
 */
@Override
public void onOrientationChanged(int orientation) {
    // 手机平放,获取不到旋转角度
    if (orientation == OrientationEventListener.ORIENTATION_UNKNOWN) {
        return;
    }

    // 获取手机旋转角度 : 0
    if (orientation > 350 || orientation < 10) {
        // 在当前旋转角度下,仅调用一次,切换角度后再去调用
        if (!isCall(0)) {
            // 根据旋转的角度,调整推流编码、发送SEI、调整渲染的view、activity方向
            adjustVideoEnc(0);
        }
    // 获取手机旋转角度 : 90
    } else if (orientation > 80 &amp;&amp; orientation < 100) {
        // 在当前旋转角度下,仅调用一次,切换角度后再去调用
        if (!isCall(90)) {
            // 根据旋转的角度,调整推流编码、发送SEI、调整渲染的view、activity方向
            adjustVideoEnc(90);
        }
    // 获取手机旋转角度 : 180
    } else if (orientation > 170 &amp;&amp; orientation < 190) {
        // 在当前旋转角度下,仅调用一次,切换角度后再去调用
        if (!isCall(180)) {
            // 根据旋转的角度,调整推流编码、发送SEI、调整渲染的view、activity方向
            adjustVideoEnc(180);
        }
    // 获取手机旋转角度 : 270
    } else if (orientation > 260 &amp;&amp; orientation < 280) {
        // 在当前旋转角度下,仅调用一次,切换角度后再去调用
        if (!isCall(270)) {
            // 根据旋转的角度,调整推流编码、发送SEI、调整渲染的view、activity方向
            adjustVideoEnc(270);
        }
    }
}

手机的旋转角度事件,非常频繁,避免重复调用,需要控制下请求:

(这里仅是示例,根据实际需要进行调整逻辑!)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 在指定旋转角度,是否已经操作了,避免连续在同一个旋转角度操作多次
 * @param mOrientation 0、90、180、270度
 * @return true: 之前一次已经操作过了,不要再次操作了;  false:之前一次没操作过,你去操作吧
 */
public boolean isCall(int mOrientation) {
    Boolean flag = mRotationCall.get(mOrientation);
    if (flag == null) {
        flag = false;
    }

    switch (mOrientation) {
        case 0:
            mRotationCall.put(0, true);
            mRotationCall.put(90, false);
            mRotationCall.put(180, false);
            mRotationCall.put(270, false);
            break;
        case 90:
            mRotationCall.put(0, false);
            mRotationCall.put(90, true);
            mRotationCall.put(180, false);
            mRotationCall.put(270, false);
            break;
        case 180:
            mRotationCall.put(0, false);
            mRotationCall.put(90, false);
            mRotationCall.put(180, true);
            mRotationCall.put(270, false);
            break;
        case 270:
            mRotationCall.put(0, false);
            mRotationCall.put(90, false);
            mRotationCall.put(180, false);
            mRotationCall.put(270, true);
            break;
        default:
            break;
    }
    return flag;
}

5)根据不同的旋转角度,调整编码参数、发送SEI消息、旋转远端用户的画面、activity横竖屏

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 1)推到远端流的编码参数
 *    1.1)如果是竖屏,就设置竖屏的编码参数
 *    1.2)如果是横屏,就设置横屏的编码参数
 * 2)发送 SEI 消息
 *    1.1)如果当前是横屏推流,就告诉房间内其他人,我当前在推横屏
 *        1.1.1)房间内其他用户收到后,调整对应用户的 view 的宽高比,避免出现黑边
 *    1.2)如果当前是竖屏推流,就告诉房间内其他人,我当前在推竖屏
 *        1.1.1)房间内其他用户收到后,调整对应用户的 view 的宽高比,避免出现黑边
 * 3)旋转远端用户的画面
 *    3.1)我当前拉取到了其他人的流,我当前切换成 横屏/竖屏 ,需要旋转远端用户的画面,避免方向不一致
 * 4)设置当前 activity 横屏 或 竖屏
 * @param mOrientation 旋转的角度,如:0 90 180 270
 */
public void adjustVideoEnc(int mOrientation) {
    // 本地画面旋转角度设置 0
    TRTCCloudDef.TRTCRenderParams params = new TRTCCloudDef.TRTCRenderParams();
    params.rotation = TRTC_VIDEO_ROTATION_0;
    mTRTCCloud.setLocalRenderParams(params);

    switch (mOrientation) {
        case 0:
            Log.d(TAG, "旋转角度 0");
            // 1)设置推到远端的编码参数
            TRTCCloudDef.TRTCVideoEncParam param = new TRTCCloudDef.TRTCVideoEncParam();
            param.videoResolutionMode = TRTC_VIDEO_RESOLUTION_MODE_PORTRAIT; // 竖屏
            mTRTCCloud.setVideoEncoderParam(param);

            // 2)发送消息给房间内其它用户,说自己调整了横竖屏
            JSONObject buildInfoJson = new JSONObject();
            try {
                buildInfoJson.put("TRTC_VIDEO_RESOLUTION_MODE", "PORTRAIT");
            } catch (Exception e) {
            }
            mTRTCCloud.sendSEIMsg(buildInfoJson.toString().getBytes(), 1);

            // 3)旋转订阅的远端画面
            for (String uid : mRemoteUidList){
                TRTCCloudDef.TRTCRenderParams renderParams = new TRTCCloudDef.TRTCRenderParams();
                renderParams.rotation = TRTCCloudDef.TRTC_VIDEO_ROTATION_0;
                renderParams.fillMode = TRTCCloudDef.TRTC_VIDEO_RENDER_MODE_FIT;  // 默认值fill,这里手动指定fit
                mTRTCCloud.setRemoteRenderParams(uid, TRTC_VIDEO_STREAM_TYPE_BIG, renderParams);
            }

            // 4)设置 activity 竖屏
            VideoCallingActivity.this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            break;
        case 90:
            Log.d(TAG, "旋转角度 90");
            // 1)设置推到远端的编码参数
            param = new TRTCCloudDef.TRTCVideoEncParam();
            param.videoResolutionMode = TRTC_VIDEO_RESOLUTION_MODE_LANDSCAPE; // 横屏
            mTRTCCloud.setVideoEncoderParam(param);

            // 2)发送消息给房间内其它用户,说自己调整了横竖屏
            buildInfoJson = new JSONObject();
            try {
                buildInfoJson.put("TRTC_VIDEO_RESOLUTION_MODE", "LANDSCAPE");
            } catch (Exception e) {
            }
            mTRTCCloud.sendSEIMsg(buildInfoJson.toString().getBytes(), 1);

            // 3)旋转订阅的远端画面
            for (String uid : mRemoteUidList){
                TRTCCloudDef.TRTCRenderParams renderParams = new TRTCCloudDef.TRTCRenderParams();
                renderParams.rotation = TRTCCloudDef.TRTC_VIDEO_ROTATION_180;
                renderParams.fillMode = TRTCCloudDef.TRTC_VIDEO_RENDER_MODE_FIT;  // 默认值fill,这里手动指定fit
                mTRTCCloud.setRemoteRenderParams(uid, TRTC_VIDEO_STREAM_TYPE_BIG, renderParams);
            }

            // 4)设置 activity 横屏
            VideoCallingActivity.this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
            break;
        case 180:
            Log.d(TAG, "旋转角度 180");
            // 1)设置推到远端的编码参数
            param = new TRTCCloudDef.TRTCVideoEncParam();
            param.videoResolutionMode = TRTC_VIDEO_RESOLUTION_MODE_PORTRAIT; // 竖屏
            mTRTCCloud.setVideoEncoderParam(param);

            // 2)发送消息给房间内其它用户,说自己调整了横竖屏
            buildInfoJson = new JSONObject();
            try {
                buildInfoJson.put("TRTC_VIDEO_RESOLUTION_MODE", "PORTRAIT");
            } catch (Exception e) {
            }
            mTRTCCloud.sendSEIMsg(buildInfoJson.toString().getBytes(), 1);

            // 3)旋转订阅的远端画面
            for (String uid : mRemoteUidList){
                TRTCCloudDef.TRTCRenderParams renderParams = new TRTCCloudDef.TRTCRenderParams();
                renderParams.rotation = TRTCCloudDef.TRTC_VIDEO_ROTATION_180;
                renderParams.fillMode = TRTCCloudDef.TRTC_VIDEO_RENDER_MODE_FIT;  // 默认值fill,这里手动指定fit
                mTRTCCloud.setRemoteRenderParams(uid, TRTC_VIDEO_STREAM_TYPE_BIG, renderParams);
            }

            // 4)设置 activity 竖屏
            VideoCallingActivity.this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            break;
        case 270:
            Log.d(TAG, "旋转角度 270");
            // 1)设置推到远端的编码参数
            param = new TRTCCloudDef.TRTCVideoEncParam();
            param.videoResolutionMode = TRTC_VIDEO_RESOLUTION_MODE_LANDSCAPE; // 横屏
            mTRTCCloud.setVideoEncoderParam(param);

            // 2)发送消息给房间内其它用户,说自己调整了横竖屏
            buildInfoJson = new JSONObject();
            try {
                buildInfoJson.put("TRTC_VIDEO_RESOLUTION_MODE", "LANDSCAPE");
            } catch (Exception e) {
            }
            mTRTCCloud.sendSEIMsg(buildInfoJson.toString().getBytes(), 1);

            // 3)旋转订阅的远端画面
            for (String uid : mRemoteUidList){
                TRTCCloudDef.TRTCRenderParams renderParams = new TRTCCloudDef.TRTCRenderParams();
                renderParams.rotation = TRTCCloudDef.TRTC_VIDEO_ROTATION_0;
                renderParams.fillMode = TRTCCloudDef.TRTC_VIDEO_RENDER_MODE_FIT;  // 默认值fill,这里手动指定fit
                mTRTCCloud.setRemoteRenderParams(uid, TRTC_VIDEO_STREAM_TYPE_BIG, renderParams);
            }

            // 4)设置 activity 横屏
            VideoCallingActivity.this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
            break;
        default:
            break;
    }
}

6)收到SEI消息、首帧视频

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/***
 * 收到元旦用户告知,远端用户切换了横屏/竖屏,赶紧调整下 view 的窗口大小
 * @param userId 发送消息的用户
 * @param data 发送的数据
 */
@Override
public void onRecvSEIMsg(String userId, byte[] data) {
    // 解析数据
    Map<String, Object> objectMap = new Gson().fromJson(new String(data), Map.class);
    Object mode = objectMap.get("TRTC_VIDEO_RESOLUTION_MODE");
    if (mode instanceof String) {
        // 横屏
        if (mode.equals("LANDSCAPE")) {
            // 当前收到远端用户告知为横屏,调整该远端用户 view 的大小,以免出现黑边
            // 设置传入的宽高,仅表示 宽 > 高
            adjustRemoteViewResolutionMode(userId, 1, 0);
        // 竖屏
        } else if (mode.equals("PORTRAIT")) {
            // 当前收到远端用户告知为竖屏,调整该远端用户 view 的大小,以免出现黑边
            // 设置传入的宽高,仅表示 宽 < 高
            adjustRemoteViewResolutionMode(userId, 0, 1);
        }
    }
}

/***
 * 收到用户的第一帧视频画面
 * 如果 userId 为空值,代表 SDK 已经开始渲染自己本地的视频画面
 * 如果 userId 不为空,代表 SDK 已经开始渲染远端用户的视频画面
 * @param userId 哪个用户的视频首帧
 * @param streamType 流类型
 * @param width 宽
 * @param height 高
 */
@Override
public void onFirstVideoFrame(String userId, int streamType, int width, int height) {
    /**
     * 不为空,即为远端用户的,也仅仅调整远端用户的 view
     */
    if (userId != null) {
        // 根据首帧收到的宽高,来确定流的分辨率,以便调整 view 的宽高
        // 宽 > 高,说明要 view的 宽 > 高
        // 宽 < 高,说明要 view的 宽 < 高
        adjustRemoteViewResolutionMode(userId, width, height);
    }
}

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 调整远端 view 的大小
 * 当传入的 宽 > 高,说明是要横着展示远端的流,那么 view 的 宽 > 高 来设置
 *    1)如果 view 的 宽 > 高 , 就不做处理
 *    2)如果 view 的 宽 < 高 , 那就把 宽和高 对调下大小
 * 当传入的 宽 < 高,说明是要横着展示远端的流,那么 view 的 宽 < 高 来设置
 *    1)如果 view 的 宽 < 高 , 就不做处理
 *    2)如果 view 的 宽 > 高 , 那就把 宽和高 对调下大小
 * @param userId 对应的远端用户
 * @param width 宽度
 * @param height 高度
 */
private void adjustRemoteViewResolutionMode(String userId, int width, int height) {
    // 获取对应 userId 的下标
    int index = mRemoteUidList.indexOf(userId);
    // index 不等于 -1,说明存在该 userId
    if (index != -1) {
        // 根据 index 获取对应用户的 view
        TXCloudVideoView videoView = mRemoteViewList.get(index);
        // 获取该 userId 对应 view 的 LayoutParams
        ViewGroup.LayoutParams layoutParams = videoView.getLayoutParams();
        // 如果传入过来要求的 宽 > 高,即 横着
        if (width > height) {
            // 如果已经给它的 宽 < 高,那么就要调整他,使它的 宽 > 高,宽高对调即可
            if (layoutParams.width < layoutParams.height) {
                int tempWidth = layoutParams.width;
                layoutParams.width = layoutParams.height;
                layoutParams.height = tempWidth;
                videoView.setLayoutParams(layoutParams);
            }
        // 如果传入过来要求的 宽 < 高,即 竖着
        } else if (width < height) {
            // 如果已经给它的 宽 > 高,那么就要调整他,使它的 宽 < 高,宽高对调即可
            if (layoutParams.width > layoutParams.height) {
                int tempWidth = layoutParams.width;
                layoutParams.width = layoutParams.height;
                layoutParams.height = tempWidth;
                videoView.setLayoutParams(layoutParams);
            }
        }
    }
}

代码示例

当运行demo时,记得修改 GenerateTestUserSig 文件中的 SDKAPPID、SECRETKEY,才能正常运行起来。

文件:Debug\src\main\java\com\tencent\trtc\debug\GenerateTestUserSig.java

控制台上获取对应的应用信息
控制台上获取对应的应用信息

演示示例代码:如附件

TRTC-API-Example.zip

参考文档

视频画面旋转和缩放:https://cloud.tencent.com/document/product/647/32237

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-04-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
2 条评论
热度
最新
楼主你好,可以提供一份这个工程的源码学习吗? 最近在捣鼓Qt 6.3 qml播放视频的东西,但是发现qml这边的MediaPlayer不能设置解码器,感觉需要从c++这边进行解码在放给qml播放。 仅自学!十分感谢!
楼主你好,可以提供一份这个工程的源码学习吗? 最近在捣鼓Qt 6.3 qml播放视频的东西,但是发现qml这边的MediaPlayer不能设置解码器,感觉需要从c++这边进行解码在放给qml播放。 仅自学!十分感谢!
回复回复点赞举报
兄弟我很想学习学习你的这个工程的源码
兄弟我很想学习学习你的这个工程的源码
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
RFID-RC522的使用[通俗易懂]
射频识别技术RFID(Radio Frequency Identification),又称为电子标签、无线射频识别,是一种非接触式的自动识别技术,通过无线电讯号识别特定目标并读写相关数据而无需识别系统与特定目标之间建立机械或光学接触。可用于识别高速运动物体并可同时识别多个标签,过程中无需人工干预,操作快捷方便。可工作于各种环境,实现对各类物体或设备(人员、物品)在不同状态(移动、静止或恶劣环境)下的自动识别和管理。
全栈程序员站长
2022/07/29
1.6K0
RFID-MFRC522射频识别模块,S50卡M1
1、M1卡分为16个扇区,每个扇区由4块(块0、块1、块2、块3)组成,(我们也将16个扇区的64个块按绝对地址编号为0~63,存贮结构如下图所示:
全栈程序员站长
2022/09/14
1.5K0
RFID-MFRC522射频识别模块,S50卡M1
STM32+MFRC522完成IC卡号读取、密码修改、数据读写
完整工程源码下载: https://download.csdn.net/download/xiaolong1126626497/18905806
DS小龙哥
2022/01/17
4.7K0
STM32+MFRC522完成IC卡号读取、密码修改、数据读写
RC522(RFID模块)实践总结
此次使用RC522模块和S50卡实现近场通讯功能(开发板与RC522通讯方式为硬件SPI),就实践过程中的一些知识点进行总结:
全栈程序员站长
2022/07/22
3.7K0
RC522(RFID模块)实践总结
STM32–RFID无线射频技术(RC522刷卡模块)
 射频识别,即RFID是Radio Frequency Ident ificat ion的缩写,又称无线射频识别,是一.种通信技术,可通过无线电讯号识别特定目标并读写相关数据,而无需识别系统与特定目标之间建立机械或光学接触。一套完整RFID硬件统由Reader 与Transponder 两部份组成,其动作原理为由Reader 发射一特定频率之无限电波能量给Transponder,用以驱动Transponder电路将內部之ID Code送出,此时Reader便接收此ID Code Transponder的特殊在于免用电池、免接触、免刷卡故不怕脏污,且晶片密码为世界唯一无法复制, 安全性高、长寿命。
全栈程序员站长
2022/09/17
3.7K0
STM32–RFID无线射频技术(RC522刷卡模块)
rfid-rc522使用教程_RFID读写方式是什么
我们常见的RC522大概如下所示,PCB部分是主机,然后白色的和绿色的都是IC卡,IC卡可以存储信息,通过靠近PCB主机部分就可以被感应到从而触发主机做出相应的动作,比如读取IC卡信息,写入数据等操作。
全栈程序员站长
2022/10/02
2.3K0
rfid-rc522使用教程_RFID读写方式是什么
RFID RC522门禁系统「建议收藏」
RFID RC522门禁系统说明: 基于51单片机的RFID RC522门禁系统的主要功能是,在本系统中主要是演示了RFID RC522门禁系统,在单片机内部的RAM中IDBUFFER中存了学号:1505106001对应 16进制就是5b b6 18 51 ;然后在RFID RC522开卡系统中,为第一张卡在块地址0x08处,写入了学号,当卡中的内容和单片机上的内容相配时,门打开。 具体程序如下所示: MAIN.C
全栈程序员站长
2022/10/02
9350
ESP32开发之旅——RC522模块的使用
​ 射频识别RFID(Radio Frequency Identification)是一种无线数据传输系统,用于在标签和读取器设备之间传输数据,而RC522模块则是用于读取和写入RFID卡和标签,该模块的工作频率为13.56MHz。
全栈程序员站长
2022/09/14
2.1K0
STM32F103+RFID-RC522模块 实现简单读卡写卡demo「建议收藏」
本文不含任何广告性质,仅供学习参考。写卡需谨慎!!!,不然可能会玩崩了。血的教训!!!
全栈程序员站长
2022/07/23
3.7K0
STM32F103+RFID-RC522模块 实现简单读卡写卡demo「建议收藏」
RFID-RC522/STM32F103RB/KEIL5 简单实现读取卡片ID[通俗易懂]
在这篇文章【 https://blog.csdn.net/qq_28877125/article/details/80437095 】的基础上修改完成!
全栈程序员站长
2022/09/29
1.7K0
RFID-RC522/STM32F103RB/KEIL5 简单实现读取卡片ID[通俗易懂]
rc522 nfc_基于单片机的门禁系统
(2021/11/1编辑) 在项目需要做一个NFC门禁功能的时候,突然发现有个RC522丢在我的桌面,甚至不知道它上面的引脚什么意思(还不会SPI通讯),搜索关键词“RC522”去看博客搜索资料,发现了很多都在说扇区,块,S50(M1)卡,然后就给代码,一开始我还以为S50是内嵌在这个模块里面的一个存储器,然后越看越怪,后面去淘宝搜索S50,才发现S50其实是我们的门禁卡,RC522是用来感应和判断的。
全栈程序员站长
2022/09/29
1.1K0
rc522 nfc_基于单片机的门禁系统
单片机_MFRC522射频模块使用方法(含代码)
522模块总共有8个引脚,除去复位、GND接地、3.3V电源、NC端悬空、SCK时钟端,剩余3个引脚,起数据作用。
全栈程序员站长
2022/09/17
2.3K0
单片机_MFRC522射频模块使用方法(含代码)
基于HL-1开发板开发RFID(RC522模块)射频电路基础
图片中重点写出引脚的相应接口名称。 —————————————————————手动分割线———————————————————–
全栈程序员站长
2022/09/14
1.3K0
基于HL-1开发板开发RFID(RC522模块)射频电路基础
STM32F103ZET–RFID-RC522使用例程(战舰版)
每每有陌生人加我就是问我要这个的工程,心累,文末有工程下载链接。希望再有人加我QQ是跟我聊技术,而不是:“大神,能发个工程给我吗?”
全栈程序员站长
2022/07/22
6780
基于esp8266开发板实现宿舍门禁
菜菜有点菜
2023/12/11
2270
rfid-rc522模块中文资料_驱动模块
1.每张卡有唯一的序列号,32位 2.卡的容量是8Kbit的EEPROM 3.分为16个扇区,每个扇区分为4块,每块16个字节,以块为存取单位 4.每个扇区都有独立的一组密码和访问控制
全栈程序员站长
2022/11/04
3.6K1
rfid-rc522模块中文资料_驱动模块
PS2手柄遥控Arduino小车[通俗易懂]
使用手柄遥控小车是经常要用到的,看到PS2手柄很6,就拿来尝试一下。 PS2手柄是索尼的PlayStation2游戏机的遥控手柄,因为这款手柄性价比较高,按键丰富,方便扩展到其它应用中,后来有人将其通讯协议破解,使得手柄可以用在遥控其他电器上,比如遥控控制机器人小车。
全栈程序员站长
2022/07/01
2.9K0
PS2手柄遥控Arduino小车[通俗易懂]
基于STM32的RC522模块读写数据块以及电子钱包充值扣款系统的设计
本人也是正在学习单片机知识的萌新一枚,在这里记录下自己完成这个小设计的过程跟大家分享一下,也请大家指出我哪里还有不足可以改进的地方。秉着和大家一起学习进步发布了这篇文章
全栈程序员站长
2022/10/02
3.1K2
基于STM32的RC522模块读写数据块以及电子钱包充值扣款系统的设计
基于stm32门禁系统_老式门禁
RC522射频门禁识别模块非常常用,某宝卖家提供的程序基本都是使用软件模拟SPI的方式进行驱动的,但是实测使用软件模拟SPI识别速率、准确性没有硬件SPI驱动时高,因此本篇博客用于记录使用STM32硬件SPI驱动RC522门禁模块。
全栈程序员站长
2022/09/30
1K0
基于stm32门禁系统_老式门禁
RC522 射频读卡器模块(MINI型)
二、[主芯片介绍] MF RC522是应用于13.56MHz非接触式通信中高集成度的读写卡芯片,是NXP公司针对“三表”应用推出的一款低电压、低成本、体积小的非接触式读写卡芯片,是智能仪表和便携式手持设备研发的较好选择。 MF RC522利用了先进的调制和解调概念,完全集成了在13.56MHz下所有类型的被动非接触式通信方式和协议。支持14443A兼容应答器信号。数字部分处理ISO14443A帧和错误检测。此外,还支持快速CRYPTO1加密算法,用语验证MIFARE系列产品。MFRC522支持MIFARE系列更高速的非接触式通信,双向数据传输速率高达424kbit/s。 作为13.56MHz高集成度读写卡系列芯片家族的新成员,MF RC522与MF RC500和MF RC530有不少相似之处,同时也具备许多特点和差异。它与主机间通信采用连线较少的串行通信,且可根据不同的用户需求,选取SPI、IIC或串行UART模式之一,有利于减少连线,缩小PCB板体积,降低成本。
全栈程序员站长
2022/09/06
1.3K0
RC522 射频读卡器模块(MINI型)
推荐阅读
相关推荐
RFID-RC522的使用[通俗易懂]
更多 >
交个朋友
加入前端学习入门群
前端基础系统教学 经验分享避坑指南
加入前端工作实战群
前端工程化实践 组件库开发经验分享
加入前端趋势交流群
追踪前端新趋势 交流学习心得
换一批
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档