Android MediaCodec 简明教程(一):使用 MediaCodecList 查询 Codec 信息,并创建 MediaCodec 编解码器

系列文章目录


文章目录

  • 系列文章目录
  • 前言
  • 一、MediaCodecList 是什么?
  • 二、MediaCodecList 使用方法
    • 1. 获取 MediaCodecList 实例
    • 2. 列出设备上支持的编解码器
    • 3. 获取编解码器详细信息
    • 4. 判断设备是否支持某种编解码器
    • 5. 查询默认的编解码器
  • 三、通过 MediaCodecList 创建 MediaCodec
    • 3.1 创建解码器
    • 3.2 创建编码器
  • 总结
  • 参考


前言

最近在学习 Android MediaCodec 相关的知识,准备开个新坑把学习过程记录下来,总结成 MediaCodec 教程。在介绍 MediaCodec 编解码之前,让我们学习一些其他与之配套的组件,今天要讲的是 MediaCodecList。


提示:以下是本篇文章正文内容,下面案例可供参考

一、MediaCodecList 是什么?

MediaCodecList 是 Android 提供的一个类,用于查询设备上可用的编解码器(codecs)。编解码器是用于编码和解码数据的软件组件,例如音频或视频数据。

MediaCodecList 提供了一种方法来获取设备上所有可用的编解码器的信息,包括它们的名称、支持的数据格式等。这对于开发需要处理音频或视频数据的应用程序非常有用。

例如,你可以使用 MediaCodecList 来查找设备上是否有支持特定视频格式的编解码器,如果有,你可以使用这个编解码器来处理这种格式的视频数据。

二、MediaCodecList 使用方法

1. 获取 MediaCodecList 实例

可以通过以下方式获取 MediaCodecList 实例:

MediaCodecList codecList = new MediaCodecList(MediaCodecList.ALL_CODECS);

其中,ALL_CODECS 表示列出所有编解码器,也可以使用 REGULAR_CODECS 表示只列出正常编解码器。在笔者的华为测试机上,ALL_CODECS 与 REGULAR_CODECS 有部分差别,在 ALL_CODECS 中有一些带 .secure 的解码器类型 ,例如 OMX.hisi.video.decoder.avc.secure

2. 列出设备上支持的编解码器

可以通过以下方式列出设备上支持的编解码器:

MediaCodecInfo[] codecInfos = codecList.getCodecInfos();

其中,codecInfos 是一个包含所有支持的编解码器信息的数组。

3. 获取编解码器详细信息

可以通过以下方式获取编解码器的详细信息:

MediaCodecInfo codecInfo = codecInfos[i];
String name = codecInfo.getName(); // 编解码器名称
String canonicalName = codecInfo.getCanonicalName(); // 编解码器规范名称
boolean isEncoder = codecInfo.isEncoder(); // 是编码器吗?
boolean isVendor = codecInfo.isVendor(); // 是厂商提供的吗?
boolean isSoftwareOnly = codecInfo.isSoftwareOnly(); // 纯软件实现的编解码器?
boolean isHardwareAccelerated = codecINfo.isHardwareAccelerated(); // 有硬件加速?
String[] types = codecInfo.getSupportedTypes(); // 支持的媒体类型
MediaCodecInfo.CodecCapabilities capabilities = codecInfo.getCapabilitiesForType(type); // 编解码器的配置参数

canonicalName 是编码器规范名称,在 Android 中,一个编解码器可能有多个别名,为了保持向后兼容性,设备实现可能会为同一个编解码器提供多个别名。getCanonicalName() 方法返回的是编解码器的规范名称,它必须是唯一的,不能是别名。

isHardwareAccelerated 查询是否有硬件加速,很多厂商提供编解码器都有硬件加速。

下面是笔者机器上的编解码器信息:

codec: c2.android.aac.decoder, canonicalName: c2.android.aac.decoder, types: [audio/mp4a-latm], isEncoder = false, isVendor = false, isAlias = false, isSoftwareOnly = true, isHardwareAccelerated = false
codec: OMX.google.aac.decoder, canonicalName: c2.android.aac.decoder, types: [audio/mp4a-latm], isEncoder = false, isVendor = false, isAlias = true, isSoftwareOnly = true, isHardwareAccelerated = false
codec: c2.android.aac.encoder, canonicalName: c2.android.aac.encoder, types: [audio/mp4a-latm], isEncoder = true, isVendor = false, isAlias = false, isSoftwareOnly = true, isHardwareAccelerated = false
codec: OMX.google.aac.encoder, canonicalName: c2.android.aac.encoder, types: [audio/mp4a-latm], isEncoder = true, isVendor = false, isAlias = true, isSoftwareOnly = true, isHardwareAccelerated = false
codec: c2.android.amrnb.decoder, canonicalName: c2.android.amrnb.decoder, types: [audio/3gpp], isEncoder = false, isVendor = false, isAlias = false, isSoftwareOnly = true, isHardwareAccelerated = false
codec: OMX.google.amrnb.decoder, canonicalName: c2.android.amrnb.decoder, types: [audio/3gpp], isEncoder = false, isVendor = false, isAlias = true, isSoftwareOnly = true, isHardwareAccelerated = false
codec: c2.android.amrnb.encoder, canonicalName: c2.android.amrnb.encoder, types: [audio/3gpp], isEncoder = true, isVendor = false, isAlias = false, isSoftwareOnly = true, isHardwareAccelerated = false
codec: OMX.google.amrnb.encoder, canonicalName: c2.android.amrnb.encoder, types: [audio/3gpp], isEncoder = true, isVendor = false, isAlias = true, isSoftwareOnly = true, isHardwareAccelerated = false
codec: c2.android.amrwb.decoder, canonicalName: c2.android.amrwb.decoder, types: [audio/amr-wb], isEncoder = false, isVendor = false, isAlias = false, isSoftwareOnly = true, isHardwareAccelerated = false
codec: OMX.google.amrwb.decoder, canonicalName: c2.android.amrwb.decoder, types: [audio/amr-wb], isEncoder = false, isVendor = false, isAlias = true, isSoftwareOnly = true, isHardwareAccelerated = false
codec: c2.android.amrwb.encoder, canonicalName: c2.android.amrwb.encoder, types: [audio/amr-wb], isEncoder = true, isVendor = false, isAlias = false, isSoftwareOnly = true, isHardwareAccelerated = false
codec: OMX.google.amrwb.encoder, canonicalName: c2.android.amrwb.encoder, types: [audio/amr-wb], isEncoder = true, isVendor = false, isAlias = true, isSoftwareOnly = true, isHardwareAccelerated = false
codec: c2.android.flac.decoder, canonicalName: c2.android.flac.decoder, types: [audio/flac], isEncoder = false, isVendor = false, isAlias = false, isSoftwareOnly = true, isHardwareAccelerated = false
codec: OMX.google.flac.decoder, canonicalName: c2.android.flac.decoder, types: [audio/flac], isEncoder = false, isVendor = false, isAlias = true, isSoftwareOnly = true, isHardwareAccelerated = false
codec: c2.android.flac.encoder, canonicalName: c2.android.flac.encoder, types: [audio/flac], isEncoder = true, isVendor = false, isAlias = false, isSoftwareOnly = true, isHardwareAccelerated = false
codec: OMX.google.flac.encoder, canonicalName: c2.android.flac.encoder, types: [audio/flac], isEncoder = true, isVendor = false, isAlias = true, isSoftwareOnly = true, isHardwareAccelerated = false
codec: c2.android.g711.alaw.decoder, canonicalName: c2.android.g711.alaw.decoder, types: [audio/g711-alaw], isEncoder = false, isVendor = false, isAlias = false, isSoftwareOnly = true, isHardwareAccelerated = false
codec: OMX.google.g711.alaw.decoder, canonicalName: c2.android.g711.alaw.decoder, types: [audio/g711-alaw], isEncoder = false, isVendor = false, isAlias = true, isSoftwareOnly = true, isHardwareAccelerated = false
codec: c2.android.g711.mlaw.decoder, canonicalName: c2.android.g711.mlaw.decoder, types: [audio/g711-mlaw], isEncoder = false, isVendor = false, isAlias = false, isSoftwareOnly = true, isHardwareAccelerated = false
codec: OMX.google.g711.mlaw.decoder, canonicalName: c2.android.g711.mlaw.decoder, types: [audio/g711-mlaw], isEncoder = false, isVendor = false, isAlias = true, isSoftwareOnly = true, isHardwareAccelerated = false
codec: c2.android.gsm.decoder, canonicalName: c2.android.gsm.decoder, types: [audio/gsm], isEncoder = false, isVendor = false, isAlias = false, isSoftwareOnly = true, isHardwareAccelerated = false
codec: OMX.google.gsm.decoder, canonicalName: c2.android.gsm.decoder, types: [audio/gsm], isEncoder = false, isVendor = false, isAlias = true, isSoftwareOnly = true, isHardwareAccelerated = false
codec: c2.android.mp3.decoder, canonicalName: c2.android.mp3.decoder, types: [audio/mpeg], isEncoder = false, isVendor = false, isAlias = false, isSoftwareOnly = true, isHardwareAccelerated = false
codec: OMX.google.mp3.decoder, canonicalName: c2.android.mp3.decoder, types: [audio/mpeg], isEncoder = false, isVendor = false, isAlias = true, isSoftwareOnly = true, isHardwareAccelerated = false
codec: c2.android.opus.decoder, canonicalName: c2.android.opus.decoder, types: [audio/opus], isEncoder = false, isVendor = false, isAlias = false, isSoftwareOnly = true, isHardwareAccelerated = false
codec: OMX.google.opus.decoder, canonicalName: c2.android.opus.decoder, types: [audio/opus], isEncoder = false, isVendor = false, isAlias = true, isSoftwareOnly = true, isHardwareAccelerated = false
codec: c2.android.opus.encoder, canonicalName: c2.android.opus.encoder, types: [audio/opus], isEncoder = true, isVendor = false, isAlias = false, isSoftwareOnly = true, isHardwareAccelerated = false
codec: c2.android.raw.decoder, canonicalName: c2.android.raw.decoder, types: [audio/raw], isEncoder = false, isVendor = false, isAlias = false, isSoftwareOnly = true, isHardwareAccelerated = false
codec: OMX.google.raw.decoder, canonicalName: c2.android.raw.decoder, types: [audio/raw], isEncoder = false, isVendor = false, isAlias = true, isSoftwareOnly = true, isHardwareAccelerated = false
codec: c2.android.vorbis.decoder, canonicalName: c2.android.vorbis.decoder, types: [audio/vorbis], isEncoder = false, isVendor = false, isAlias = false, isSoftwareOnly = true, isHardwareAccelerated = false
codec: OMX.google.vorbis.decoder, canonicalName: c2.android.vorbis.decoder, types: [audio/vorbis], isEncoder = false, isVendor = false, isAlias = true, isSoftwareOnly = true, isHardwareAccelerated = false
codec: OMX.dolby.ac3.decoder, canonicalName: OMX.dolby.ac3.decoder, types: [audio/ac3], isEncoder = false, isVendor = true, isAlias = false, isSoftwareOnly = false, isHardwareAccelerated = true
codec: OMX.dolby.ac4.decoder, canonicalName: OMX.dolby.ac4.decoder, types: [audio/ac4], isEncoder = false, isVendor = true, isAlias = false, isSoftwareOnly = false, isHardwareAccelerated = true
codec: OMX.dolby.eac3.decoder, canonicalName: OMX.dolby.eac3.decoder, types: [audio/eac3], isEncoder = false, isVendor = true, isAlias = false, isSoftwareOnly = false, isHardwareAccelerated = true
codec: OMX.dolby.eac3_joc.decoder, canonicalName: OMX.dolby.eac3_joc.decoder, types: [audio/eac3-joc], isEncoder = false, isVendor = true, isAlias = false, isSoftwareOnly = false, isHardwareAccelerated = true
codec: OMX.hisi.video.decoder.avc, canonicalName: OMX.hisi.video.decoder.avc, types: [video/avc], isEncoder = false, isVendor = true, isAlias = false, isSoftwareOnly = false, isHardwareAccelerated = true
codec: OMX.hisi.video.decoder.avc.secure, canonicalName: OMX.hisi.video.decoder.avc.secure, types: [video/avc], isEncoder = false, isVendor = true, isAlias = false, isSoftwareOnly = false, isHardwareAccelerated = true
codec: OMX.hisi.video.decoder.hevc, canonicalName: OMX.hisi.video.decoder.hevc, types: [video/hevc], isEncoder = false, isVendor = true, isAlias = false, isSoftwareOnly = false, isHardwareAccelerated = true
codec: OMX.hisi.video.decoder.hevc.secure, canonicalName: OMX.hisi.video.decoder.hevc.secure, types: [video/hevc], isEncoder = false, isVendor = true, isAlias = false, isSoftwareOnly = false, isHardwareAccelerated = true
codec: OMX.hisi.video.decoder.mpeg2, canonicalName: OMX.hisi.video.decoder.mpeg2, types: [video/mpeg2], isEncoder = false, isVendor = true, isAlias = false, isSoftwareOnly = false, isHardwareAccelerated = true
codec: OMX.hisi.video.decoder.mpeg4, canonicalName: OMX.hisi.video.decoder.mpeg4, types: [video/mp4v-es], isEncoder = false, isVendor = true, isAlias = false, isSoftwareOnly = false, isHardwareAccelerated = true
codec: OMX.hisi.video.decoder.vp8, canonicalName: OMX.hisi.video.decoder.vp8, types: [video/x-vnd.on2.vp8], isEncoder = false, isVendor = true, isAlias = false, isSoftwareOnly = false, isHardwareAccelerated = true
codec: OMX.hisi.video.decoder.vp9, canonicalName: OMX.hisi.video.decoder.vp9, types: [video/x-vnd.on2.vp9], isEncoder = false, isVendor = true, isAlias = false, isSoftwareOnly = false, isHardwareAccelerated = true
codec: OMX.hisi.video.decoder.vp9.secure, canonicalName: OMX.hisi.video.decoder.vp9.secure, types: [video/x-vnd.on2.vp9], isEncoder = false, isVendor = true, isAlias = false, isSoftwareOnly = false, isHardwareAccelerated = true
codec: OMX.hisi.video.encoder.avc, canonicalName: OMX.hisi.video.encoder.avc, types: [video/avc], isEncoder = true, isVendor = true, isAlias = false, isSoftwareOnly = false, isHardwareAccelerated = true
codec: OMX.hisi.video.encoder.hevc, canonicalName: OMX.hisi.video.encoder.hevc, types: [video/hevc], isEncoder = true, isVendor = true, isAlias = false, isSoftwareOnly = false, isHardwareAccelerated = true
codec: c2.android.av1.decoder, canonicalName: c2.android.av1.decoder, types: [video/av01], isEncoder = false, isVendor = false, isAlias = false, isSoftwareOnly = true, isHardwareAccelerated = false
codec: c2.android.avc.decoder, canonicalName: c2.android.avc.decoder, types: [video/avc], isEncoder = false, isVendor = false, isAlias = false, isSoftwareOnly = true, isHardwareAccelerated = false
codec: OMX.google.h264.decoder, canonicalName: c2.android.avc.decoder, types: [video/avc], isEncoder = false, isVendor = false, isAlias = true, isSoftwareOnly = true, isHardwareAccelerated = false
codec: c2.android.avc.encoder, canonicalName: c2.android.avc.encoder, types: [video/avc], isEncoder = true, isVendor = false, isAlias = false, isSoftwareOnly = true, isHardwareAccelerated = false
codec: OMX.google.h264.encoder, canonicalName: c2.android.avc.encoder, types: [video/avc], isEncoder = true, isVendor = false, isAlias = true, isSoftwareOnly = true, isHardwareAccelerated = false
codec: c2.android.h263.decoder, canonicalName: c2.android.h263.decoder, types: [video/3gpp], isEncoder = false, isVendor = false, isAlias = false, isSoftwareOnly = true, isHardwareAccelerated = false
codec: OMX.google.h263.decoder, canonicalName: c2.android.h263.decoder, types: [video/3gpp], isEncoder = false, isVendor = false, isAlias = true, isSoftwareOnly = true, isHardwareAccelerated = false
codec: c2.android.h263.encoder, canonicalName: c2.android.h263.encoder, types: [video/3gpp], isEncoder = true, isVendor = false, isAlias = false, isSoftwareOnly = true, isHardwareAccelerated = false
codec: OMX.google.h263.encoder, canonicalName: c2.android.h263.encoder, types: [video/3gpp], isEncoder = true, isVendor = false, isAlias = true, isSoftwareOnly = true, isHardwareAccelerated = false
codec: c2.android.hevc.decoder, canonicalName: c2.android.hevc.decoder, types: [video/hevc], isEncoder = false, isVendor = false, isAlias = false, isSoftwareOnly = true, isHardwareAccelerated = false
codec: OMX.google.hevc.decoder, canonicalName: c2.android.hevc.decoder, types: [video/hevc], isEncoder = false, isVendor = false, isAlias = true, isSoftwareOnly = true, isHardwareAccelerated = false
codec: c2.android.hevc.encoder, canonicalName: c2.android.hevc.encoder, types: [video/hevc], isEncoder = true, isVendor = false, isAlias = false, isSoftwareOnly = true, isHardwareAccelerated = false
codec: c2.android.mpeg4.decoder, canonicalName: c2.android.mpeg4.decoder, types: [video/mp4v-es], isEncoder = false, isVendor = false, isAlias = false, isSoftwareOnly = true, isHardwareAccelerated = false
codec: OMX.google.mpeg4.decoder, canonicalName: c2.android.mpeg4.decoder, types: [video/mp4v-es], isEncoder = false, isVendor = false, isAlias = true, isSoftwareOnly = true, isHardwareAccelerated = false
codec: c2.android.mpeg4.encoder, canonicalName: c2.android.mpeg4.encoder, types: [video/mp4v-es], isEncoder = true, isVendor = false, isAlias = false, isSoftwareOnly = true, isHardwareAccelerated = false
codec: OMX.google.mpeg4.encoder, canonicalName: c2.android.mpeg4.encoder, types: [video/mp4v-es], isEncoder = true, isVendor = false, isAlias = true, isSoftwareOnly = true, isHardwareAccelerated = false
codec: c2.android.vp8.decoder, canonicalName: c2.android.vp8.decoder, types: [video/x-vnd.on2.vp8], isEncoder = false, isVendor = false, isAlias = false, isSoftwareOnly = true, isHardwareAccelerated = false
codec: OMX.google.vp8.decoder, canonicalName: c2.android.vp8.decoder, types: [video/x-vnd.on2.vp8], isEncoder = false, isVendor = false, isAlias = true, isSoftwareOnly = true, isHardwareAccelerated = false
codec: c2.android.vp8.encoder, canonicalName: c2.android.vp8.encoder, types: [video/x-vnd.on2.vp8], isEncoder = true, isVendor = false, isAlias = false, isSoftwareOnly = true, isHardwareAccelerated = false
codec: OMX.google.vp8.encoder, canonicalName: c2.android.vp8.encoder, types: [video/x-vnd.on2.vp8], isEncoder = true, isVendor = false, isAlias = true, isSoftwareOnly = true, isHardwareAccelerated = false
codec: c2.android.vp9.decoder, canonicalName: c2.android.vp9.decoder, types: [video/x-vnd.on2.vp9], isEncoder = false, isVendor = false, isAlias = false, isSoftwareOnly = true, isHardwareAccelerated = false
codec: OMX.google.vp9.decoder, canonicalName: c2.android.vp9.decoder, types: [video/x-vnd.on2.vp9], isEncoder = false, isVendor = false, isAlias = true, isSoftwareOnly = true, isHardwareAccelerated = false
codec: c2.android.vp9.encoder, canonicalName: c2.android.vp9.encoder, types: [video/x-vnd.on2.vp9], isEncoder = true, isVendor = false, isAlias = false, isSoftwareOnly = true, isHardwareAccelerated = false
codec: OMX.google.vp9.encoder, canonicalName: c2.android.vp9.encoder, types: [video/x-vnd.on2.vp9], isEncoder = true, isVendor = false, isAlias = true, isSoftwareOnly = true, isHardwareAccelerated = false

4. 判断设备是否支持某种编解码器

可以使用以下方式判断设备是否支持某种编解码器:

boolean isEncoder = true; // 是否为编码器
String mimeType = "video/avc"; // 媒体类型
MediaCodecInfo codecInfo = codecList.findCodecForType(mimeType);
if (codecInfo != null) {String name = codecInfo.getName();if (isEncoder) {MediaCodecInfo.CodecCapabilities capabilities = codecInfo.getCapabilitiesForType(mimeType);if (capabilities != null && capabilities.isEncoder()) {// 设备支持该编码器}} else {// 设备支持该解码器}
}

其中,isEncoder 表示是否为编码器,mimeType 表示媒体类型。

5. 查询默认的编解码器

对于某种 MediaFormat,MediaCodecList 支持查询哪种 Codec 支持这种 Format:

MediaCodecInfo codecInfo = codecList.findEncoderForFormat(format);
if (codecInfo != null) {String name = codecInfo.getName();// 使用默认编码器
}

其中,format 表示媒体格式。

三、通过 MediaCodecList 创建 MediaCodec

3.1 创建解码器

想要解码某个文件,首先要创建 MediaCodec 解码器,基本步骤是

  1. 创建 MediaCodecList 实例
  2. 使用 MediaExtractor 获取 Track 的 Format 信息
  3. 根据 Format 找到默认的解码器信息 MediaCodecInfo
  4. 根据 MediaCodecInfo 中的信息创建 MediaCodec
    代码如下:
public class Decoder {public void decodeFile(String filePath) {MediaExtractor extractor = new MediaExtractor();try {extractor.setDataSource(filePath);} catch (IOException e) {e.printStackTrace();}// 获取文件中的第一个轨道MediaFormat format = extractor.getTrackFormat(0);String mime = format.getString(MediaFormat.KEY_MIME);// 使用 MediaCodecList 来找到支持这个媒体类型的解码器MediaCodecList codecList = new MediaCodecList(MediaCodecList.ALL_CODECS);String decoderName = codecList.findDecoderForFormat(format);// 创建 MediaCodec 解码器MediaCodec decoder = null;try {decoder = MediaCodec.createByCodecName(decoderName);} catch (IOException e) {e.printStackTrace();}// 配置解码器decoder.configure(format, null, null, 0);decoder.start();// ... 这里可以开始解码操作}
}

3.2 创建编码器

  1. 创建 MediaCodecList 实例
  2. 构建 MediaFormat 用于描述目标编码的格式
  3. 通过 MediaCodecList 查询 MediaFormat 的默认编码器信息 MediaCodecInfo
  4. 根据 MediaCodecInfo 中的信息创建 MediaCodec
    代码如下:
public class Encoder {public void encodeToFormat(String mimeType) {// 创建 MediaCodecList 实例MediaCodecList codecList = new MediaCodecList(MediaCodecList.ALL_CODECS);// 构建 MediaFormat 用于描述目标编码的格式MediaFormat format = MediaFormat.createVideoFormat(mimeType, 640, 480);// 通过 MediaCodecList 查询 MediaFormat 的默认编码器信息 MediaCodecInfoString encoderName = codecList.findEncoderForFormat(format);// 根据 MediaCodecInfo 中的信息创建 MediaCodecMediaCodec encoder = null;try {encoder = MediaCodec.createByCodecName(encoderName);} catch (IOException e) {e.printStackTrace();}// 配置编码器encoder.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);encoder.start();// ... 这里可以开始编码操作}
}

总结

本文介绍了 MediaCodecList 的基本使用方法,并展示了如何使用 MediaCodecList 来创建 MediaCodec 编解码器。

参考

  • MediaCodecList

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/616786.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java 设计模式】设计原则之开放封闭原则

文章目录 1. 定义2. 好处3. 应用4. 示例结语 在软件开发中,设计原则是创建灵活、可维护和可扩展软件的基础。 这些原则为我们提供了指导方针,帮助我们构建高质量、易理解的代码。 ✨单一职责原则(SRP) ✨开放/封闭原则&#xff08…

69、python - 利用向量内积来优化卷积运算

上一节介绍了利用 python 实现的原始卷积版本性能很差的原因,不知道各位同学有尝试的么? 这一节介绍下如何对卷积的乘累加进行一次优化:我们利用 np.dot 来进行优化。 np.dot np.dot 是 numpy 库提供的一个函数,用来计算两个向量的点积,或者叫内积。那什么是内积呢? …

Pygame程序的屏幕显示

不同对象的绘制与显示过程 在Pygame中,需要将所有需要在屏幕上显示的内容都绘制在一个display surface上。该Surface通常称为screen surface,它是pygame.display.set_mode()函数返回的Surface对象。 在绘制不同对象时,可以使用不同的绘制方…

AI绘画软件Stable Diffusion模型/Lora/VAE文件存放位置

型下载说明(下载模型后输入对应参数即可生成) 建议直接去civitai.com找模型,如果无法找到可以在幕后模型区找也可以去, 下载好后放入对应的文件夹。进入127.0.0.1:7680 左上角刷新即可看到新的模型。 模型种类 大模型 大模型特…

计算机找不到msvcr100.dll的多种解决方法分享,轻松解决dll问题

msvcr100.dll作为系统运行过程中不可或缺的一部分,它的主要功能在于提供必要的运行时支持,确保相关应用程序能够顺利完成编译和执行。因此,当操作系统或应用程序在运行阶段搜索不到该文件时,自然会导致各类依赖于它的代码无法正常…

C语言学习记录—进阶作业(通讯录动态版本)

动态版本通讯录 1. 通讯录默认能够存放3个人的信息。 2. 如果空间不够&#xff0c;就增加空间&#xff0c;每次增加2个人的空间。 contact.h文件 #pragma once #include <string.h> #include <stdio.h> #include <assert.h> #include <stdlib.h>#de…

C语言基础语法跟练 day3

31、不使用累计乘法的基础上&#xff0c;通过移位运算&#xff08;<<&#xff09;实现2的n次方的计算。 #include <stdio.h> int main() {int i 0;scanf("%d",&i);printf("%d",1<<i);return 0; } 32、问题&#xff1a;一年约有 3.…

L1-023 输出GPLT(Java)

给定一个长度不超过10000的、仅由英文字母构成的字符串。请将字符重新调整顺序&#xff0c;按GPLTGPLT....这样的顺序输出&#xff0c;并忽略其它字符。当然&#xff0c;四种字符&#xff08;不区分大小写&#xff09;的个数不一定是一样多的&#xff0c;若某种字符已经输出完&…

c#多线程中使用SemaphoreSlim

SemaphoreSlim是一个用于同步和限制并发访问的类&#xff0c;和它类似的还有Semaphore&#xff0c;只是SemaphoreSlim更加的轻量、高效、好用。今天说说它&#xff0c;以及如何使用&#xff0c;在什么时候去使用&#xff0c;使用它将会带来什么优势。 代码的业务是&#xff1a…

档案数字化怎样快速整理资料

对于机构和组织来说&#xff0c;档案数字化是一个重要的信息管理和保护措施。要快速整理资料进行档案数字化&#xff0c;可以遵循以下步骤&#xff1a; 1. 准备工具和设备&#xff1a;确保有一台计算机、扫描仪和相关软件。 2. 分类和组织资料&#xff1a;先将资料分类&#xf…

【linux】利用echo命令实现不换行的倒计时

1、实现5秒倒计时 #!/bin/shfor i in `seq 5`doecho -ne "$i\b"sleep 1 done 2、实现“时:分:秒”格式的倒计时 这个脚本会从5小时开始,每秒更新一次,以时:分:秒的格式显示倒计时,实现一个从5小时倒计时到0的功能。echo -ne "\r"会将光标移动到当前行…

代码随想录Day.31 | 455. 分发饼干、376. 摆动序列、53. 最大子序和

455. 分发饼干 1. LeetCode链接 455. 分发饼干 - 力扣&#xff08;LeetCode&#xff09; 2. 题目描述 3. 解法 贪心法&#xff0c;首先想到的是&#xff0c;局部最优&#xff1a;让每个孩子尽可能拿能拿到的最小饼干尺寸。为了方便查找&#xff0c;这就要求至少饼干尺寸是从…

简单易懂深入PyTorch中RNN、LSTM和GRU使用和理解

目录 torch.nn子模块Recurrent Layers nn.RNNBase RNNBase 类描述 RNNBase 类的功能和作用 flatten_parameters() 方法 示例代码 nn.RNN RNN 类描述 RNN 类的功能和作用 RNN 类的参数 输入和输出 注意事项 示例代码 nn.LSTM LSTM 类描述 LSTM 类的功能和作用 …

MySQL的Windows系统安装

一、MySQL的Windows系统安装 1、下载MySQL安装包 打开如下链接地址&#xff0c;下载安装包 2、安装并配置 双击下载好的安装包进行安装&#xff0c;出现如下界面&#xff1a; 选择【 Full 】选项&#xff0c;然后单击【 Next 】按钮。 出现如下界面&#xff0c;单击【 Execute…

Halcon经典的边缘检测算子Sobel/Laplace/Canny

Halcon经典的边缘检测算子 文章目录 Halcon经典的边缘检测算子1. Sobel算子2. Laplace 算子3. Canny 算子4. 总结 关于边缘检测&#xff0c;有许多经典的算子&#xff0c;各大图形处理库都有各自的边缘检测算子&#xff0c;这里简要介绍几种。 1. Sobel算子 Sobel算子结合了高…

【野火i.MX6NULL开发板】挂载 NFS 网络文件系统

0、前言 参考资料&#xff1a; &#xff08;误人子弟&#xff09;《野火 Linux 基础与应用开发实战指南基于 i.MX6ULL 系列》PDF 第22章 参考视频&#xff1a;&#xff08;成功&#xff09; https://www.bilibili.com/video/BV1JK4y1t7io?p26&vd_sourcefb8dcae0aee3f1aab…

JVM 11 调优指南:如何进行JVM调优,JVM调优参数

JVM 11的优化指南&#xff1a;如何进行JVM调优&#xff0c;以及JVM调优参数有哪些”这篇文章将包含JVM 11调优的核心概念、重要性、调优参数&#xff0c;并提供12个实用的代码示例&#xff0c;每个示例都会结合JVM调优参数和Java代码 本文已收录于&#xff0c;我的技术网站 dd…

Jmeter Linux环境压测Lottery接口

1、把Dubbo插件放到Linux中Jmeter的lib/ext目录下 2、参数化 3、设置线程数 4、把测试计划中的Dubbo路径替换成Linux中的路径 /home/apache-jmeter-5.5/lib/ext 5、上传压测脚本到压力机 6、执行压测&#xff0c;观察是否有消息积压 ①Jmeter中执行压测脚本 ②检查mq控制台是…

数字图像线性滤波——方框、均值、高斯滤波及opencv(C++)实现示例

数字图像线性滤波——方框、均值、高斯滤波及opencv&#xff08;C&#xff09;实现示例 一、图像滤波概念简介二、方框滤波及opencv实现示例1、方框滤波的公式2、opencv方框滤波boxfilter()函数&#xff08;1&#xff09;函数介绍&#xff08;2&#xff09;opencv实现实例&…

微信小程序案例-03翻页时钟-3

微信小程序实战系列 《微信小程序实战-01翻页时钟-1》《微信小程序实战-02翻页时钟-2》 文章目录 微信小程序实战系列前言动态翻页效果实现clock.wxmlclock.wxssclock.js运行效果 总结 前言 本文继续完成最后一个部分“动态翻页效果”。 动态翻页效果实现 clock.wxml <…