ios 音频录音、上传至7牛、播放及其与android兼容的问题

2023-05-16

iOS录音使用AVAudioRecorder,播放用 AVPlayer 就可以很好的解决,网上也有很多的教程。这里就不细讲,后面会附上代码。

先说一下demo内容,现在项目要求做一个录音、上传、播放的功能。细节:录音前需要提示音,录音时会有一个根据声音强度来展示的相应动态效果,还有个计时功能。

我们来说一下我在制作此功能时所遇到的坑!!

这里先呈现音频录制的代码,这里面引用了SpectrumView,点击打开链接。这是一个根据声强来显示声音录制的效果,如果不需要可以去除。

录制音频代码:

1.首先说一下录制音频的格式。

   经验证,这里博主建议各位使用AAC的录制格式。AAC(Advanced Audio Coding),中文称为“高级音频编码”,所占内存小,音质也不错,最重要的是可以与android兼容。


2.这里用的是7牛云的上传。这里我遇到的大问题就是上传音频到7牛云后,发现格式不能识别,显示为application/octet-stream。我最开始用.mp4的格式,的确上传上去后,能够识别为video/mp4,并且能正常播放。 但是后来发现不能播放android的录音。于是就想办法解决,经过一下午的各种博客浏览,。。。无果!! 好吧,最后想到先本地存储,再来播放的方式,解决问题。(这里的录音文件都比较小,不超过30s)


这里附上部分demo片段,有需要自取。

录音部分:#import "AudioRecorderVC.h"
#import <AVFoundation/AVFoundation.h>
#define kRecordAudioFile @"myRecord.aac"

@interface AudioRecorderVC ()<AVAudioRecorderDelegate>
@property (strong,nonatomic) SpectrumView *spectrumView;
@property (nonatomic,strong) AVAudioRecorder *audioRecorder;//音频录音机
@property (nonatomic, strong) AVAudioPlayer *bellplayer;
@property (nonatomic, assign) int sCountup;
@property (nonatomic, strong) NSTimer *mTimer;
@end

@implementation AudioRecorderVC

#pragma mark - 控制器视图方法
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
[self.naView setHidden:YES];
[self.statusTip setHidden:YES];
[self.view createBordersWithColor:[UIColor clearColor] withCornerRadius:6 andWidth:1];
[self.labReminder createBordersWithColor:[UIColor clearColor] withCornerRadius:4 andWidth:1];
[self.labReminder setTextColor:MCOLOR_FFFFFF];
[self addTapGesture];
[self addSpectrumView];
[self labToSize];
}

-(void)addSpectrumView{
if (!self.spectrumView) {
__weak AudioRecorderVC *weakSelf = self;
self.spectrumView = [[SpectrumView alloc] initWithFrame:CGRectMake(CGRectGetMidX(self.view.bounds)-150,240,300, 60.0)];
self.spectrumView.hidden = YES;
self.spectrumView.text = [NSString stringWithFormat:@"%d",0];
__weak SpectrumView * weakSpectrum = self.spectrumView;
self.spectrumView.itemLevelCallback = ^() {

[weakSelf.audioRecorder updateMeters];
//取得第一个通道的音频,音频强度范围是-160到0
float power= [weakSelf.audioRecorder averagePowerForChannel:0];
weakSpectrum.level = power;
};
[self.view addSubview:self.spectrumView];
}
}

-(void)addTapGesture{
//添加手势
UITapGestureRecognizer * tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(clickPop)];
//将手势添加到需要相应的view中去
[self.view addGestureRecognizer:tapGesture];
}

-(void)clickPop{
if (_Block) {
_Block(nil);
}
}

#pragma mark - getter 懒加载
- (UIButton *)btnRecorder {
// 开始
[_btnRecorder addTarget:self action:@selector(recordStart:) forControlEvents:UIControlEventTouchDown];
// 取消
// [_btnRecorder addTarget:self action:@selector(recordCancel:) forControlEvents: UIControlEventTouchUpOutside];
//完成
[_btnRecorder addTarget:self action:@selector(recordFinish:) forControlEvents:UIControlEventTouchUpInside];
/*
//移出
[_btnRecorder addTarget:self action:@selector(recordTouchDragExit:) forControlEvents:UIControlEventTouchDragExit];
//移入
[_btnRecorder addTarget:self action:@selector(recordTouchDragEnter:) forControlEvents:UIControlEventTouchDragEnter];
*/
return _btnRecorder;
}

/**
* 获得录音机对象
*
* @return 录音机对象
*/
- (AVAudioRecorder *)audioRecorder {
if (!_audioRecorder) {
[self setAudioSession];
//创建录音文件保存路径
NSURL *url=[self getSavePath];
//创建录音格式设置
NSDictionary *setting=[self getAudioSetting];
//创建录音机
NSError *error=nil;
_audioRecorder=[[AVAudioRecorder alloc]initWithURL:url settings:setting error:&error];
_audioRecorder.delegate= self;
_audioRecorder.meteringEnabled=YES;//如果要监控声波则必须设置为YES
if (error) {
NSLog(@"创建录音机对象时发生错误,错误信息:%@",error.localizedDescription);
return nil;
}
}
return _audioRecorder;
}

#pragma mark - layout

- (void)viewDidLayoutSubviews {
[super viewDidLayoutSubviews];
CGFloat width = self.view.bounds.size.width;
CGFloat height = self.view.bounds.size.height;
self.btnRecorder.frame = CGRectMake(width / 2.f - 50.f, height - 180.f, 100.f, 100.f);
[self.audioRecorder record];
[self.audioRecorder stop];
[self removeFile];
}

#pragma mark - ControlEvents
/*
- (void)recordCancel:(UIButton *)button {

if ([self.audioRecorder isRecording]) {
NSLog(@"取消");
[self.audioRecorder stop];
self.spectrumView.hidden = NO;
}
}
*/
- (void)recordStart:(UIButton *)button {
if (![self.audioRecorder isRecording]) {
NSLog(@"录音开始");
[self startScount];
[self playthebell];
[self.audioRecorder record];
[self startAnimate];
self.labReminder.hidden = YES;
self.spectrumView.hidden = NO;

}
}

- (void)recordFinish:(UIButton *)button {

if ([self.audioRecorder isRecording]) {
NSLog(@"完成");
[self.audioRecorder stop];
[self stopAnimate];
self.spectrumView.hidden = NO;
[self judgePushAudio];
}
}
/*
- (void)recordTouchDragExit:(UIButton *)button {
if([self.audioRecorder isRecording]) {
[self stopAnimate];
}
}

- (void)recordTouchDragEnter:(UIButton *)button {
if([self.audioRecorder isRecording]) {
[self startAnimate];
}
}
*/
- (void)startAnimate {
[self.spectrumView start];
}

- (void)stopAnimate {
[self.spectrumView stop];
[self.mTimer invalidate];
self.mTimer = nil;
}

- (void)setAudioSession {
AVAudioSession *session = [AVAudioSession sharedInstance];
NSError *sessionError;
//AVAudioSessionCategoryPlayAndRecord用于录音和播放
[session setCategory:AVAudioSessionCategoryPlayAndRecord error:&sessionError];
if(session == nil)
NSLog(@"Error creating session: %@", [sessionError description]);
else
[session setActive:YES error:nil];
}

/**
* 取得录音文件设置
*
* @return 录音设置
*/
- (NSDictionary *)getAudioSetting {
NSMutableDictionary *dicM=[NSMutableDictionary dictionary];
//设置录音格式
[dicM setObject:@(kAudioFormatMPEG4AAC) forKey:AVFormatIDKey];
//设置录音采样率,8000是电话采样率,对于一般录音已经够了
[dicM setObject:@(8000) forKey:AVSampleRateKey];
//设置通道,这里采用单声道
[dicM setObject:@(1) forKey:AVNumberOfChannelsKey];
//每个采样点位数,分为8、16、24、32
[dicM setObject:@(8) forKey:AVLinearPCMBitDepthKey];
//是否使用浮点数采样
[dicM setObject:@(YES) forKey:AVLinearPCMIsFloatKey];
//....其他设置等

return dicM;
}

/**
* 取得录音文件保存路径
*
* @return 录音文件路径
*/
- (NSURL *)getSavePath {

// 在Documents目录下创建一个名为FileData的文件夹
NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject] stringByAppendingPathComponent:@"AudioData"];
NSFileManager *fileManager = [NSFileManager defaultManager];
BOOL isDir = FALSE;
BOOL isDirExist = [fileManager fileExistsAtPath:path isDirectory:&isDir];
if(!(isDirExist && isDir)) {
BOOL bCreateDir = [fileManager createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:nil];
if(!bCreateDir){
NSLog(@"创建文件夹失败!");
}
NSLog(@"创建文件夹成功,文件路径%@",path);
}
path = [path stringByAppendingPathComponent:kRecordAudioFile];
NSLog(@"file path:%@",path);
NSURL *url=[NSURL fileURLWithPath:path];

return url;
}

- (void)removeFile{
NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject] stringByAppendingPathComponent:@"AudioData"];
NSFileManager *fileManager = [NSFileManager defaultManager];
path = [path stringByAppendingPathComponent:kRecordAudioFile];
NSError *error;
if ([fileManager removeItemAtPath:path error:&error] != YES)
NSLog(@"Unable to delete file: %@", [error localizedDescription]);

}

- (void)judgePushAudio{
if (_sCountup < 1) {
[self showToast:@"录音时间太短,请重试!"];
[self removeFile];

}else if(_sCountup >= 1 && _sCountup <= 30){
if (_Block) {
_Block([self getSavePath]);
}
}
}

- (void)labToSize{
NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:self.labReminder.text];
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
[paragraphStyle setLineSpacing:20.0f];//调整行间距
[attributedString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, [self.labReminder.text length])];
self.labReminder.attributedText = attributedString;
[self.labReminder sizeToFit];
}

#pragma --提示音
- (void)playthebell{
NSString *mp3Str;
mp3Str = @"talkroom_begin";
NSString *filePath = [[NSBundle mainBundle] pathForResource:mp3Str ofType:@"mp3"];
self.bellplayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:filePath] error:nil];
self.bellplayer.volume = 1.0;
self.bellplayer.numberOfLoops = -1;
[self.bellplayer prepareToPlay];
[self.bellplayer play];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, ( 0.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self.bellplayer stop];
});
}

#pragma --计时器
- (void)startScount{
self.sCountup = 0;
[UIView animateWithDuration:0.5 animations:^{
self.mTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(startCountUp) userInfo:nil repeats:YES];
}];
}

- (void)startCountUp{
_sCountup++;
self.spectrumView.timeLabel.text = [NSString stringWithFormat:@"%ds", _sCountup];
if (_sCountup == 30) {
[self recordFinish:nil];
}
}

@end

3
#pragma --播放录音
- (void)addVoiceButton:(DoorVoucherCell *)cell{
    UIButton *voiceBtn = [[UIButton alloc]initWithFrame:CGRectMake(cell.contentValue.left, 0, 150, 50)];
    [voiceBtn addTarget:self action:@selector(playRecoderVoice) forControlEvents:UIControlEventTouchUpInside];
    voice = [[UIImageView alloc]initWithFrame:CGRectMake(0, 12, 25, 25)];
    //动画未开始前的图片
    voice.image = [UIImage imageNamed:@"chat_animation_white3"];
    //进行动画效果的3张图片(按照播放顺序放置)
    voice.animationImages = [NSArray arrayWithObjects:
                             [UIImage imageNamed:@"chat_animation_white1"],
                             [UIImage imageNamed:@"chat_animation_white2"],
                             [UIImage imageNamed:@"chat_animation_white3"],nil];
    //设置动画间隔
    voice.animationDuration = 1;
    voice.animationRepeatCount = 0;
    voice.userInteractionEnabled = NO;
    voice.backgroundColor = [UIColor clearColor];
    [voiceBtn addSubview:voice];
    [cell addSubview:voiceBtn];
}

- (NSURL *)writeRecoderToFile{
    //播放
    NSURL *url = [NSURL URLWithString:self.dataModel.voice];
    //把音频文件保存到本地
    NSData *audioData = [NSData dataWithContentsOfURL:url];
    NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject] stringByAppendingPathComponent:@"AudioData"];
    path = [path stringByAppendingPathComponent:@"myRecord.aac"];
    //  DDLogWarn(@" 从网络拿到的音频数据写入的本地路径  %@",filePath);
    [audioData writeToFile:path atomically:YES];
    
    NSURL *fileURL = [NSURL fileURLWithPath:path];
    return fileURL;
}

- (void)playRecoderVoice{
    [self setAudioPlayer];
    [self.audioPlayer play];
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        [voice startAnimating];
    });
}

- (void)playerItemDidReachEnd{
    [self playthebell];
    [voice stopAnimating];
    voice.image = [UIImage imageNamed:@"chat_animation_white3"];
}



- (AVPlayer *)setAudioPlayer{
    NSError *error=nil;
    AVPlayerItem * songItem = [[AVPlayerItem alloc]initWithURL:[self writeRecoderToFile]];
    AVAudioSession *session = [AVAudioSession sharedInstance];
    [session setActive:YES error:nil];
    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
    [session setCategory:AVAudioSessionCategoryPlayback error:nil];
    _audioPlayer = [[AVPlayer alloc] initWithPlayerItem:songItem];
    // 监听音乐是否播放完成
    
    [[NSNotificationCenter defaultCenter] addObserver:self
     
                                             selector:@selector(playerItemDidReachEnd)
     
                                                 name:AVPlayerItemDidPlayToEndTimeNotification
     
                                               object:nil];
    if (error) {
        NSLog(@"创建播放器过程中发生错误,错误信息:%@",error.localizedDescription);
        return nil;
    }
    return _audioPlayer;
}

#pragma --提示音
- (void)playthebell{
    NSString *mp3Str;
    mp3Str = @"talkroom_up";
    NSString *filePath = [[NSBundle mainBundle] pathForResource:mp3Str ofType:@"mp3"];
    self.bellplayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:filePath] error:nil];
    self.bellplayer.volume = 1.0;
    self.bellplayer.numberOfLoops = -1;
    [self.bellplayer prepareToPlay];
    [self.bellplayer play];
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, ( 0.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        [self.bellplayer stop];
    });
}






有问题欢迎提问,喜欢请点赞,Star。谢谢。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ios 音频录音、上传至7牛、播放及其与android兼容的问题 的相关文章

  • ubuntu 14.04安装x11VNC

    环境 xff1a Ubuntu 14 04 1 xff09 安装x11vnc xff1a sudo apt get install x11vnc 2 xff09 设置VNC的连接密码 xff1a x11vnc storepasswd Ent
  • ios中几种跳转方式,普通,和StoryBoard跳转

    一 纯代码界面跳转方式 1 导航控制器 UINavigationController self navigationController pushViewController NewVC animated YES 跳转到下一界面 self
  • 【组织架构】中国铁路哈尔滨局集团有限公司

    0 参考 中国铁路哈尔滨局集团有限公司 1 公司简介 中国铁路哈尔滨局集团有限公司 xff08 China Railway Harbin Group Co Ltd xff09 xff0c 简称哈局 xff0c 是中国国家铁路集团有限公司管理
  • 【组织架构】中国铁路呼和浩特局集团有限公司

    0 参考 中国铁路呼和浩特局集团有限公司 1 公司介绍 中国铁路呼和浩特局集团有限公司 xff0c 是中国国家铁路集团有限公司管理的18个铁路局集团有限公司之一 xff0c 简称 呼局 成立于1958年11月1日 xff0c 地处内蒙古自治
  • 【组织架构】中国铁路郑州局集团有限公司

    0 参考 中国铁路郑州局集团有限公司 1 公司介绍 中国铁路郑州局集团有限公司 xff0c 是中国国家铁路集团有限公司管理的18个铁路局集团有限公司之一 xff0c 简称 郑局 正式成立于1949年3月11日 xff0c 总部位于河南省郑州
  • 【组织架构】中国铁路武汉局集团有限公司

    0 参考 中国铁路武汉局集团有限公司 1 公司介绍 中国铁路武汉局集团有限公司 xff0c 是中国国家铁路集团有限公司管理的18个铁路局集团有限公司之一 xff0c 简称 武局 成立于2005年5月18日 xff0c 是全路实行局直管站段体
  • 人工智能轨道交通行业周刊-第36期(2023.2.27-3.5)

    本期关键词 xff1a 智能高铁体系架构 广州港海铁联运 5G R 铁路受电弓 电务信号工 图像压缩 1 整理涉及公众号名单 1 1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS Wor
  • 人工智能轨道交通行业周刊-第37期(2023.3.6-3.12)

    本期关键词 xff1a 智能天窗 广铁数字化 司机手势 编组站 AIGC 事件相机 1 整理涉及公众号名单 1 1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS World轨道交通联盟V
  • 人工智能轨道交通行业周刊-第38期(2023.3.13-3.19)

    本期关键词 xff1a 车顶检修机器人 CTCS 机车重联作业 铁水联运 大模型 GPT 4 1 整理涉及公众号名单 1 1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS World轨道
  • 【组织架构】中国铁路西安局集团有限公司

    0 参考 中国铁路西安局集团有限公司 1 公司介绍 中国铁路西安局集团有限公司 xff08 原西安铁路局 xff09 xff0c 是中国国家铁路集团有限公司管理的18个铁路局集团有限公司之一 xff0c 简称 西局 位于西北地区 管内有陇海
  • 【组织架构】中国铁路济南局集团有限公司

    0 参考 中国铁路济南局集团有限公司 1 公司介绍 中国铁路济南局集团有限公司 xff08 China Railway Jinan Group Co Ltd xff09 xff0c 是中国国家铁路集团有限公司管理的18个铁路局集团有限公司之
  • spark-sql处理json字符串的常用函数

    整理了spark sql处理json字符串的几个函数 xff1a 1 get json object 解析不含数组的 json 2 from json 解析json 3 schema of json 提供生成json格式的方法 4 expl
  • 【组织架构】中国铁路上海局集团有限公司

    0 参考 中国铁路上海局集团有限公司 1 公司介绍 中国铁路上海局集团有限公司成立于1994年11月15日 xff0c 注册地位于上海市静安区天目东路80号 xff0c 法定代表人为侯文玉 公司是中国国家铁路集团有限公司管理的18个铁路局集
  • 【组织架构】中国铁路南昌局集团有限公司

    0 参考 中国铁路南昌局集团有限公司 1 公司介绍 中国铁路南昌局集团有限公司 xff0c 是中国国家铁路集团有限公司管理的18个铁路局集团有限公司之一 xff0c 于2017年11月19日挂牌成立 xff0c 前身为南昌铁路局 中国铁路南
  • 【组织架构】中国铁路南宁局集团有限公司

    0 参考 中国铁路南宁局集团有限公司 1 公司介绍 中国铁路南宁局集团有限公司 xff0c 是中国国家铁路集团有限公司管理的18个铁路局集团有限公司之一 xff0c 简称 宁局 xff0c 前身是成立于1953年1月1日的柳州铁路局 xff
  • 【组织架构】中国铁路成都局集团有限公司

    0 参考 中国铁路成都局集团有限公司 1 公司介绍 中国铁路成都局集团有限公司 xff0c 是中国国家铁路集团有限公司管理的18个铁路局集团有限公司之一 xff0c 简称 成局 xff0c 地处中国西南 xff0c 管辖范围辐射四川 贵州
  • 【组织架构】中国铁路昆明局集团有限公司

    0 参考 中国铁路昆明局集团有限公司 1 公司介绍 中国铁路昆明局集团有限公司 xff0c 是中国国家铁路集团有限公司管理的18个铁路局集团有限公司之一 xff0c 简称 昆局 管理昆明铁路办事处以及开远铁路办事处 xff0c 路局机关设在
  • 人工智能轨道交通行业周刊-第39期(2023.3.20-3.26)

    本期关键词 xff1a 综合运维智控中心 现场防护员 模型先验知识 机器视觉照明 国铁统计公报 1 整理涉及公众号名单 1 1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS World轨
  • Midjourney保姆级入门教程

    0 背景 在 AI 画图领域 xff0c midjourney 目前是效果最好的一个工具 xff0c 目前已经更新到 V5 版本 xff0c 生成的各种神图层出不穷 xff0c 什么国足夺冠 特朗普插秧 教皇打碟 异形下乡 只要你敢想AI就
  • 人工智能轨道交通行业周刊-第40期(2023.3.27-4.2)

    本期关键词 xff1a TACS列车 智能雄安站 火车掉头 高铁供电 AIGC发展史 1 整理涉及公众号名单 1 1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS World轨道交通联盟

随机推荐

  • 人工智能轨道交通行业周刊-第41期(2023.4.3-4.9)

    本期关键词 xff1a 西安智慧车站 宁波应急保障 钢轨伸缩调节器 城轨统计报告 SAM SegGPT 1 整理涉及公众号名单 1 1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS Wo
  • 人工智能轨道交通行业周刊-第42期(2023.4.10-4.23)

    本期关键词 xff1a 车辆智能检测 智能运维 数字孪生 无人机 信号工装备 商汤大模型 1 整理涉及公众号名单 1 1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS World轨道交通
  • mysql视图使用

    先讲下视图的概述吧 视图是一种 虚拟表 xff0c 本身是 不具有数据 的 xff0c 占用很少的内存空间 xff0c 它是 SQL 中的一个重要概念 视图建立在已有表的基础上 视图赖以建立的这些表称为 基表 视图他自己可以被称为 从表 虚
  • 人工智能轨道交通行业周刊-第43期(2023.4.24-5.7)

    本期关键词 xff1a 综合智能检测 隧道检测 智慧城轨白皮书 虚拟编组 讯飞星火大模型 央企数字化 1 整理涉及公众号名单 1 1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS Wor
  • kolla搭建octavia

    本文是在另外一篇文章的基础上使用kolla ansible 部署octavia实践总结 部分内容总结略有粗糙 xff0c 见谅 使用kolla ansible all in one部署OpenStack Stein https blog c
  • 关闭win10自动更新——组策略

    1 为什么要关闭自动更新 我一向是推荐关闭自动更新 xff0c 然后有时间的时候自己主动去更新 xff0c 因为win10更新还是修复了一些bug的 xff0c 但是自动更新会闹出很多问题 xff0c 例如紧急开会的时候发现电脑在自动更新
  • python 中位于运算符 & 应用

    amp 运算符在计算机中是二进制运算符 xff0c 常使用 amp 61 xff0c 即先进性位于运算符 xff0c 在进行赋值 xff0c 例如 a amp 61 b 等价于 a 61 a amp b 位于运算只二进制 保同除异 a 61
  • 【FreeRDP 】

    Ubuntu18 04安装FreeRDP 远程连接Windows桌面 1 FreeRDP2 环境3 Ubuntu安装xfreerdp4 连接准备5 连接6 问题总结 1 FreeRDP FreeRDP lt 61 61 gt Remote
  • 7-1 编写程序,输入年、月、日,计算该 日是该年的第几天。要求:计算日期、判断闰年均使用自定义函数实现。

    7 1 编写程序 xff0c 输入年 月 日 xff0c 计算该 日是该年的第几天 要求 xff1a 计算日期 判断闰年均使用自定义函数实现 编写程序 xff0c 输入年 月 日 xff0c 计算该 日是该年的第几天 要求 xff1a 计算
  • ifort + mkl + impi (全套intel)编译安装量子化学软件GAMESS 2022 R1版本

    说明 xff1a linux下编译软件都需要先配置好该软件依赖的系统环境 系统环境可以通过软件的安装说明了解 xff0c 例如 xff1a readme md等文件或网页 这个前提条件很重要 xff01 后面正式编译出错基本都可以归结到系统
  • Linux C 编程技巧--利用有限状态机模型编程

    我们知道 xff0c 一般编写程序时都要画出流程图 xff0c 按照流程图结构来编程 xff0c 如果编写一个比较繁琐 xff0c 容易思维混乱的程序时 xff0c 我们可以利用有限状态机模型画出一个状态转移图 xff0c 这样便可以利用画
  • spring读取properties文件属性,文件属性与系统属性冲突

    1 问题概述 spring在读取properties文件属性时 xff0c 当文件属性与系统属性冲突时 xff0c 会读取到系统属性值 2 问题复现 2 1 读取properties文件 创建maven工程在pom xml文件中添加spri
  • C语言实现16进制数与10进制数的转化

    C语言实现16进制数与10进制数的转化 这里有两种情况 xff1a 第一种情况 xff1a 如果我得到的是一个16进制数 xff0c 我通过肉眼看到的就是16进制显示 xff08 这里看到的肯定打印结果 xff09 xff0c 比如85 x
  • MyBatisMapper代理开发中,如何将Mapper接口和sql映射文件放置在同一目录下

    1 前言 1 1 环境准备 创建一个maven工程并导入mybatis坐标及mysql驱动坐标在java目录下创建Mapper接口在resouces目录下创建配置文件和sql映射文件 1 2 正常思维 如何将Mapper接口和sql映射文件
  • MyBatis Mapper代理开发

    文章目录 1 数据库准备2 创建一个maven项目 xff0c 导入mysql驱动坐标和mybatis坐标3 在resources目录下创建配置文件4 在resources目录下创建sql映射文件5 定义mapper接口6 修改配置文件中s
  • spring开启事务

    文章目录 1 概述2 环境准备2 1 spring整合mybatis2 2 添加dao service 在service方法中调用dao方法实现转账效果 2 3 数据库准备 3 不开启事务实现转账3 1 创建测试类 Demo 3 2 运行结
  • spring事务管理原理

    1 环境准备 spring如何开启事务 2 原理 在上面链接文章中吗 xff0c 我们通过A向B转账500在不开启事务情况下 xff0c reduceMoney方法和addMoney分别开启2个不同的事务 xff0c 因此在发生异常后会出现
  • spring事务相关配置之propagation

    文章目录 1 概述2 环境准备2 1 spring整合mybatis2 2 数据库准备2 2 1 account表2 2 2 log表 2 3 创建dao service并开启spring事务2 3 1 AccountDao2 3 2 Lo
  • spring事务相关配置之rollback

    文章目录 1 概述2 环境准备3 使用 96 rollbackFor 96 1 概述 我们知道当开启spring事务后 xff0c 如果出现异常 xff0c 那么数据库数据会进行回滚 但是并不是所有异常都会回滚因此我们可以使用rollbac
  • ios 音频录音、上传至7牛、播放及其与android兼容的问题

    iOS录音使用AVAudioRecorder xff0c 播放用 AVPlayer 就可以很好的解决 xff0c 网上也有很多的教程 这里就不细讲 xff0c 后面会附上代码 先说一下demo内容 xff0c 现在项目要求做一个录音 上传