**

我使用AvPlayer写的,所以大家一定得记住要导入AvFoundation的库,话不多说,直接上代码

**

这里我是把AvPlayer封装到了一个类里,

//
//  CXPlayMvViewController.m
//  LeeMusic
//
//  Created by ChuXiang on 15/12/9.
//  Copyright © 2015年 ChuXiang. All rights reserved.
//#import "LoveMusicPlayer.h"
#import <AVFoundation/AVFoundation.h>
@implementation LoveMusicPlayer+ (LoveMusicPlayer *)sharePlayer{static LoveMusicPlayer* Player = nil;if (Player==nil) {Player =[[LoveMusicPlayer alloc] init];}return Player;
}- (void)playWithURL:(NSString *)url{AVPlayerItem * item = [[AVPlayerItem alloc] initWithURL:[NSURL URLWithString:url]];[self replaceCurrentItemWithPlayerItem: item];[self play];
}
@end

这里是在ViewController里完成的代码,我是直接找了一个音乐播放器的歌单的Url然后在这里请求数据的。
其实做起来也没那么难,AvPlayer它本身就有很多方法供大家使用,比如从url中获取歌曲总长(不过大家它给的时间是以秒为单位的,大家别忘了把它化成分秒,下面我也写到,大家可以参考),比如播放器音量,直接跟你写的音量slider绑定到一起等等。大家可以慢慢看,先把页面铺完(歌曲的图片转动我为了偷工减料就直接用计时器写了,看起来有点Low),再把该完成的方法写了就完事了。

//
//  ViewController.m
//  PlayMusic
//
//  Created by ChuXiang on 16/1/3.
//  Copyright © 2016年 ChuXiang. All rights reserved.
//#import "ViewController.h"
#import "LoveMusicPlayer.h"
#import "CXSingListModel.h"
#import <AVFoundation/AVFoundation.h>
#import "UIImageView+WebCache.h"
#import "CXNetWorkTool.h"
#define kWidth ([UIScreen mainScreen].bounds.size.width / 375)
#define kHeight ([UIScreen mainScreen].bounds.size.height / 667)
#define kControlBarHeight 300
#define kControlBarCenterY (kScreenHeight - 150)#define kScreenWidth [UIScreen mainScreen].bounds.size.width#define kScreenHeight [UIScreen mainScreen].bounds.size.height#define kControlBarOriginY (kScreenHeight - kControlBarHeight)#define kMusicInfoOriginY (kControlBarOriginY + 40)#define kControlBarCenterX self.view.center.x
#define kControlBarCenterY (kScreenHeight - 150)
#define kButtonOffsetX 120
#define kFindMusicGetURL @"http://a.vip.migu.cn/rdp2/v5.5/index.do?ua=Iphone_Sst&version=4.2421&pageno=1"@interface ViewController () <UIScrollViewDelegate>
//处理音乐数据
@property (nonatomic, copy) NSString *songId;
@property (nonatomic, retain) NSMutableArray *myArr;
@property (nonatomic, assign) NSInteger index;
@property (nonatomic, strong)  CXSingListModel *model;// 播放器
@property (nonatomic, retain) LoveMusicPlayer *player;@property (nonatomic, assign) BOOL isPlaying;
//播放列表属性
@property (nonatomic, retain) UIImageView *myImageView;
@property (nonatomic, retain) UIButton *playButton;
@property (nonatomic, retain) UILabel *authorSongLabel;
@property (nonatomic, retain) UILabel *songNameLabel;
@property (nonatomic, retain) UISlider *slider;
@property (nonatomic, retain) NSTimer *timer;
@property (nonatomic, retain) NSTimer *imgTimer;
@property (nonatomic, retain) UIImageView *backImage;
@property (nonatomic, retain) UILabel *timeLable;
@property (nonatomic, retain) UILabel *currentTimeLable;
@property (nonatomic, retain) UIScrollView *scrollView;
@property (nonatomic, retain) UIPageControl *pageControl;
@property (nonatomic, retain) UISlider *volumeSlider;//判断播放状态
@property (nonatomic, assign) NSInteger type;//播放状态的枚举
typedef NS_ENUM(NSUInteger, PlayType) {PlayTypeLive = 0,PlayTypeNext,PlayTypeLast
};@end@implementation ViewControllerstatic ViewController *single = nil;
// 单例执行 只初始化一次
+ (instancetype) shareSingleViewController {static dispatch_once_t onceToken;dispatch_once(&onceToken, ^{//  在多线程中保证只初始化一次single = [[ViewController alloc] init];});return single;
}//网络请求数据
- (void)getWithUrl:(NSString *)url parameter:(NSDictionary *)parameter withKey:(NSString *)key WithValue:(NSString *)value{self.myArr = [NSMutableArray arrayWithCapacity:0];[CXNetWorkTool getWithUrl:url parameter:nil httpHeader:nil responseType:ResponseTypeJSON success:^(id result) {if (result) {NSDictionary *dic = result;NSArray *array = dic[@"groups"];NSDictionary *dic1 = array[3];NSArray *array1 = dic1[@"songs"];for (NSDictionary *dic in array1) {CXSingListModel *model = [[CXSingListModel alloc] initWithDictionary:dic];[self.myArr addObject:model];}dispatch_async(dispatch_get_main_queue(), ^{[self createMusicData];});}}fail:^(NSError *error) {
//                NSLog(@"%@", error);}];}- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view, typically from a nib.[self getWithUrl:kFindMusicGetURL parameter:nil withKey:nil WithValue:nil];self.view.backgroundColor = [UIColor whiteColor];//    播放背景图片self.backImage = [[UIImageView alloc] initWithFrame:self.view.frame];//    上部分高亮显示UIBlurEffect *blur = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];UIVisualEffectView *effectview = [[UIVisualEffectView alloc] initWithEffect:blur];effectview.frame = CGRectMake(0, 0, self.backImage.frame.size.width , self.backImage.frame.size.height);[self.backImage addSubview:effectview];[self.view addSubview:self.backImage];//    pageControlCGFloat size_width = CGRectGetWidth(self.view.bounds) - 80;self.pageControl = [[UIPageControl alloc] initWithFrame:CGRectMake(0, 60 + size_width, kScreenWidth, 20)];self.pageControl.numberOfPages = 2;self.pageControl.currentPage = 0;//    createSrollViewself.scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, CGRectGetWidth(self.view.bounds), CGRectGetHeight(self.view.bounds) - 250)];self.scrollView.delegate = self;self.scrollView.contentSize = CGSizeMake(CGRectGetWidth(self.scrollView.bounds) * 2, CGRectGetHeight(self.scrollView.bounds));self.scrollView.pagingEnabled = YES;self.scrollView.showsHorizontalScrollIndicator = NO;[self.view addSubview:self.scrollView];[self.view addSubview:self.pageControl];//    底部播放界面 blur效果UIVisualEffectView *background = [[UIVisualEffectView alloc] initWithEffect:[UIBlurEffect effectWithStyle:UIBlurEffectStyleExtraLight]];background.frame = CGRectMake(0, kControlBarOriginY + 50, kScreenWidth, kControlBarHeight);[self.view addSubview:background];//进入之后自动播放self.isPlaying = YES;//创建音乐播放器对象self.player = [LoveMusicPlayer sharePlayer];// 添加播放完成的通知[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playbackFinished:) name:AVPlayerItemDidPlayToEndTimeNotification object:self.player.currentItem];//滚动的歌曲图片self.myImageView = [[UIImageView alloc] initWithFrame:CGRectMake(40, 50, size_width, size_width)];self.myImageView.layer.cornerRadius = size_width / 2;self.myImageView.layer.borderColor = [UIColor lightGrayColor].CGColor;self.myImageView.layer.borderWidth = 2;self.myImageView.layer.masksToBounds = YES;[self.scrollView addSubview:self.myImageView];//歌手名self.authorSongLabel = [[UILabel alloc] initWithFrame:CGRectMake( 0 , kScreenHeight - 230, kScreenWidth, 30)];//居中对齐self.authorSongLabel.textAlignment = NSTextAlignmentCenter;[self.view addSubview:self.authorSongLabel];//歌手labelself.songNameLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, self.authorSongLabel.frame.origin.y + self.authorSongLabel.frame.size.height + 10, kScreenWidth, 20)];self.songNameLabel.textAlignment = NSTextAlignmentCenter;self.songNameLabel.font = [UIFont systemFontOfSize:11];[self.view addSubview:self.songNameLabel];// 进度条self.slider = [[UISlider alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth - 100, 20)];self.slider.center = CGPointMake(kControlBarCenterX, kControlBarCenterY + 10);[self.slider setThumbImage:[UIImage imageNamed:@"volumn_slider_thumb"] forState:UIControlStateNormal];self.slider.minimumTrackTintColor = [UIColor blackColor];self.slider.minimumValue = 0.0;self.slider.maximumValue = 1.0;[self.slider addTarget:self action:@selector(progressAction:) forControlEvents:UIControlEventValueChanged];[self.view addSubview:self.slider];//声音sliderself.volumeSlider = [[UISlider alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth - 100, 20)];self.volumeSlider.center = CGPointMake(kControlBarCenterX, kControlBarCenterY + 60);[self.volumeSlider setThumbImage:[UIImage imageNamed:@"volumn_slider_thumb"] forState:UIControlStateNormal];self.volumeSlider.maximumValue = 1;self.volumeSlider.minimumValueImage = [UIImage imageNamed:@"volumelow"];self.volumeSlider.maximumValueImage = [UIImage imageNamed:@"volumehigh"];self.volumeSlider.value = 1;self.volumeSlider.minimumTrackTintColor = [UIColor blackColor];[self.volumeSlider addTarget:self action:@selector(handleVolumeAction:) forControlEvents:UIControlEventValueChanged];[self.view addSubview:self.volumeSlider];//当前播放时间labelself.currentTimeLable = [[UILabel alloc] initWithFrame:CGRectMake(self.slider.frame.origin.x - 5 - 38, self.slider.frame.origin.y, 50, 20)];self.currentTimeLable.text = @"00:00";self.currentTimeLable.font = [UIFont systemFontOfSize:13];[self.view addSubview:self.currentTimeLable];//总时间labelself.timeLable = [[UILabel alloc] initWithFrame:CGRectMake(self.slider.frame.origin.x + self.slider.frame.size.width, self.slider.frame.origin.y, 50, 20)];self.timeLable.font = [UIFont systemFontOfSize:13];[self.view addSubview:self.timeLable];self.timeLable.text = @"11:11";// 计时器 控制播放self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(playerAction) userInfo:nil repeats:YES];//    控制转动头像self.imgTimer = [NSTimer scheduledTimerWithTimeInterval:0.05 target:self selector:@selector(imgTransform) userInfo:nil repeats:YES];// 播放的buttonself.playButton = [UIButton buttonWithType:UIButtonTypeSystem];self.playButton.frame = CGRectMake(160 * kWidth, self.view.frame.size.height - 60, 50 * kWidth, 50 * kWidth);[self.playButton setBackgroundImage:[UIImage imageNamed:@"stop"] forState:UIControlStateNormal];[self.playButton addTarget:self action:@selector(clickPlay:) forControlEvents:UIControlEventTouchUpInside];self.playButton.tag = 520;[self.view addSubview:self.playButton];//上一曲的buttonUIButton *buttonUp = [UIButton buttonWithType:UIButtonTypeSystem];buttonUp.frame = CGRectMake(60 * kWidth, self.view.frame.size.height - 50, 30 * kWidth, 30 * kWidth);[buttonUp setBackgroundImage:[UIImage imageNamed:@"pause"] forState:UIControlStateNormal];[buttonUp addTarget:self action:@selector(playUp:) forControlEvents:UIControlEventTouchUpInside];[self.view addSubview:buttonUp];//下一曲的buttonUIButton *buttonNext = [UIButton buttonWithType:UIButtonTypeSystem];buttonNext.frame = CGRectMake(280 * kWidth, self.view.frame.size.height - 50, 30 * kWidth, 30 * kWidth);[buttonNext setBackgroundImage:[UIImage imageNamed:@"next"] forState:UIControlStateNormal];[buttonNext addTarget:self action:@selector(playNext:) forControlEvents:UIControlEventTouchUpInside];[self.view addSubview:buttonNext];}#pragma mark - 声音
- (void)handleVolumeAction:(UISlider *)sender {[self.player setVolume:sender.value];
}#pragma mark - SroolerView结束滑动
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {NSUInteger index = scrollView.contentOffset.x / scrollView.bounds.size.width;self.pageControl.currentPage = index;
}#pragma mark - 计时器方法 - 图片转动
- (void)imgTransform {self.myImageView.transform = CGAffineTransformRotate(self.myImageView.transform, 0.01);}#pragma mark - 播放计时器方法
-(void)playerAction{//当前时间 / 总时间self.slider.value = CMTimeGetSeconds(self.player.currentItem.currentTime) / CMTimeGetSeconds(self.player.currentItem.duration);//总共时间(右边显示)NSInteger totalTime = CMTimeGetSeconds(self.player.currentItem.duration);NSInteger minTime = totalTime / 60;NSInteger secondTime = totalTime % 60;NSString *timeStr = [NSString stringWithFormat:@"%02ld:%02ld", (long)minTime,(long)secondTime];self.timeLable.text = timeStr;//当前播放时间(左边显示)NSInteger totalTime1 = CMTimeGetSeconds(self.player.currentItem.currentTime);NSInteger minTime1 = totalTime1 / 60;NSInteger secondTime1 = totalTime1 % 60;NSString *timeStr1 = [NSString stringWithFormat:@"%02ld:%02ld", (long)minTime1,(long)secondTime1];self.currentTimeLable.text = timeStr1;//判断是否是最后一首歌曲,如果是最后一首歌,播放完之后自动变换播放按钮if((self.index == self.myArr.count - 1) && (totalTime==totalTime1)){[self.player pause];[self.playButton setBackgroundImage:[UIImage imageNamed:@"songplay"] forState:UIControlStateNormal];}}#pragma mark - 进度条方法
-(void)progressAction:(UISlider *)slider{float current = slider.value;float nextCurrent = current * CMTimeGetSeconds(self.player.currentItem.duration);[self.player seekToTime:CMTimeMakeWithSeconds(nextCurrent, 1.0)];[self.player play];//在暂停的时候,如果拉动进度条,播放按钮就变成播放图片[self.playButton setBackgroundImage:[UIImage imageNamed:@"stop"] forState:UIControlStateNormal];// 控制计时器的最大范围self.timer.fireDate =[NSDate distantPast];
}//上一曲
#pragma mark - 播放设置
- (void)playUp:(UIButton *)button{//先查找当前歌曲//判断,如果是第一首歌就不做任何操作,如果不是第一首就把id赋值给解析数据if (self.index != 0) {CXSingListModel *listMode = self.myArr[self.index - 1];//        CXSingListModel *listMode = self.musicArr[self.index - 1];NSString *str = [listMode.url stringByAppendingString:@"&ua=Iphone_Sst&version=4.2421&netType=1&toneFlag=1"];self.songId = str;_type = PlayTypeLast;//调用数据解析[self createMusicData];[self.playButton setBackgroundImage:[UIImage imageNamed:@"stop"] forState:UIControlStateNormal];}else{//当上一曲没有歌曲 弹出alert提示框[self.player pause];UIAlertController *mBoxView = [UIAlertController alertControllerWithTitle:@"嗨" message:@"上面还没有歌曲~" preferredStyle:UIAlertControllerStyleAlert];UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) {[self dismissViewControllerAnimated:YES completion:^{}];}];UIAlertAction *otherAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {[self dismissViewControllerAnimated:YES completion:^{}];}];[mBoxView addAction:cancelAction];[mBoxView addAction:otherAction];[self presentViewController:mBoxView animated:YES completion:nil];[self.playButton setBackgroundImage:[UIImage imageNamed:@"songplay"] forState:UIControlStateNormal];}}//下一曲
- (void)playNext:(UIButton *)button{//先查找当前歌曲//然后播放下一曲//判断是否是最后一曲,如果不是就重新赋值if (self.index != self.myArr.count - 1) {CXSingListModel *listMode = self.myArr[self.index + 1];NSString *str = [listMode.url stringByAppendingString:@"&ua=Iphone_Sst&version=4.2421&netType=1&toneFlag=1"];self.songId = str;_type = PlayTypeNext;[self createMusicData];}else{//当下一曲没有歌曲 弹出alert提示框UIAlertController *mBoxView = [UIAlertController alertControllerWithTitle:@"嗨" message:@"已经最后一首了~" preferredStyle:UIAlertControllerStyleAlert];UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) {[self dismissViewControllerAnimated:YES completion:^{}];}];UIAlertAction *otherAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {[self dismissViewControllerAnimated:YES completion:^{}];}];[mBoxView addAction:cancelAction];[mBoxView addAction:otherAction];[self presentViewController:mBoxView animated:YES completion:nil];[self.playButton setBackgroundImage:[UIImage imageNamed:@"songplay"] forState:UIControlStateNormal];}
}#pragma mark - 播放时界面赋值
- (void)createMusicData {//先查找当前歌曲self.index = 0;for (NSInteger i = 0; i < self.myArr.count; i++) {CXSingListModel *detailMo = self.myArr[i];NSString *str = [detailMo.url stringByAppendingString:@"&ua=Iphone_Sst&version=4.2421&netType=1&toneFlag=1"];if ([str isEqualToString:self.songId]) {self.index = i;break;}}if (_type == PlayTypeLive) {CXSingListModel *model = self.myArr[self.index];//        判断传进来的歌曲id是否与正在播放的id是否相同,如果相同不执行,不相同执行换歌if (![self.model.contentid isEqualToString:model.contentid]) {NSString *str = model.url;NSString *str1 = [str stringByAppendingString:@"&ua=Iphone_Sst&version=4.2421&netType=1&toneFlag=1"];[self.player playWithURL:str1];[self.backImage sd_setImageWithURL:[NSURL URLWithString:model.albumImg]];if ([model.albumImg isEqualToString:@""]) {self.backImage.backgroundColor = [UIColor redColor];}[self.myImageView sd_setImageWithURL:[NSURL URLWithString:model.albumImg]];self.songNameLabel.text = [NSString stringWithFormat:@"%@ - %@", model.singer, model.album];self.authorSongLabel.text = model.title;self.model = model;}}else if (_type == PlayTypeLast) {if (self.index > 0) {CXSingListModel *model = self.myArr[self.index - 1];NSString *str = model.url;NSString *str1 = [str stringByAppendingString:@"&ua=Iphone_Sst&version=4.2421&netType=1&toneFlag=1"];[self.player playWithURL:str1];[self.backImage sd_setImageWithURL:[NSURL URLWithString:model.albumImg]];[self.myImageView sd_setImageWithURL:[NSURL URLWithString:model.albumImg]];self.songNameLabel.text = [NSString stringWithFormat:@"%@ - %@", model.singer, model.album];self.authorSongLabel.text = model.title;}else {CXSingListModel *model = self.myArr[0];NSString *str = model.url;NSString *str1 = [str stringByAppendingString:@"&ua=Iphone_Sst&version=4.2421&netType=1&toneFlag=1"];[self.player playWithURL:str1];[self.backImage sd_setImageWithURL:[NSURL URLWithString:model.albumImg]];[self.myImageView sd_setImageWithURL:[NSURL URLWithString:model.albumImg]];self.songNameLabel.text = [NSString stringWithFormat:@"%@ - %@", model.singer, model.album];self.authorSongLabel.text = model.title;}}else if (_type == PlayTypeNext) {if (self.index < self.myArr.count - 2) {CXSingListModel *model = self.myArr[self.index + 1];NSString *str = model.url;NSString *str1 = [str stringByAppendingString:@"&ua=Iphone_Sst&version=4.2421&netType=1&toneFlag=1"];[self.player playWithURL:str1];[self.myImageView sd_setImageWithURL:[NSURL URLWithString:model.singerImg]];self.authorSongLabel.text = model.title;self.songNameLabel.text = [NSString stringWithFormat:@"%@ - %@", model.singer, model.album];}else {CXSingListModel *model = self.myArr[self.myArr.count - 1];NSString *str = model.url;NSString *str1 = [str stringByAppendingString:@"&ua=Iphone_Sst&version=4.2421&netType=1&toneFlag=1"];[self.player playWithURL:str1];[self.myImageView sd_setImageWithURL:[NSURL URLWithString:model.singerImg]];self.authorSongLabel.text = model.title;self.songNameLabel.text = [NSString stringWithFormat:@"%@ - %@", model.singer, model.album];}}}#pragma mark - 监听播放
//监听实现的方法
- (void)playbackFinished:(NSNotification *)notificatio{//然后播放下一曲//判断是否是最后一曲,如果不是就重新赋值//    if (self.index != self.myArr.count - 1) {if (self.index != self.myArr.count - 1) {CXSingListModel *listMode = self.myArr[self.index + 1];NSString *str = [listMode.url stringByAppendingString:@"&ua=Iphone_Sst&version=4.2421&netType=1&toneFlag=1"];self.songId = str;//调用数据解析[self createMusicData];NSLog(@"下一首");}else{[self.player pause];UIAlertController *mBoxView = [UIAlertController alertControllerWithTitle:@"嗨" message:@"已经最后一首了~" preferredStyle:UIAlertControllerStyleAlert];UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) {[self dismissViewControllerAnimated:YES completion:^{}];}];UIAlertAction *otherAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {[self dismissViewControllerAnimated:YES completion:^{}];}];[mBoxView addAction:cancelAction];[mBoxView addAction:otherAction];[self presentViewController:mBoxView animated:YES completion:nil];}
}//播放按钮
- (void)clickPlay:(UIButton *)button{self.isPlaying = !self.isPlaying;if (self.isPlaying) {[self.imgTimer setFireDate:[NSDate distantPast]];[self resume];//变成暂停按钮[button setBackgroundImage:[UIImage imageNamed:@"stop"] forState:UIControlStateNormal];}else{//计时器暂停[self.imgTimer setFireDate:[NSDate distantFuture]];[self pause];//暂停//变成播放按钮[button setBackgroundImage:[UIImage imageNamed:@"songplay"] forState:UIControlStateNormal];}}- (void)resume{[self.player play];
}- (void)pause{[self.player pause];
}//防止内存泄露
- (void)didReceiveMemoryWarning {[super didReceiveMemoryWarning];// Dispose of any resources that can be recreated.
}@end

完成后的效果图:

希望大家有什么好的想法,可以优化代码的地方私聊我,大家一起进步。加油

iOS 模仿QQ音乐用Xcode写的一个播放器相关推荐

  1. 调用QQ音乐接口,实现自制MV播放器

    本文给大家讲解如何调用QQ音乐MV接口,实现强大的MV在线播放器功能 第一步:调用MV查询接口,获取json数据,拿到vid 接口地址: https://c.y.qq.com/soso/fcgi-bi ...

  2. iOS之基于FreeStreamer的简单音乐播放器(模仿QQ音乐)

    代码地址如下: http://www.demodashi.com/demo/11944.html 天道酬勤 前言 作为一名iOS开发者,每当使用APP的时候,总难免会情不自禁的去想想,这个怎么做的?该 ...

  3. Qt5学习 模仿qq音乐播放器样式(2)——点击动画效果+歌词颜色变换展示

    拖的太久,主要再上一篇文章中,新学习了相关知识,做了右键菜单,点击按钮动画切换窗口和播放时歌词颜色显示当前播放位置. 主要为了实现功能的展示,所以很多文件读取都直接采用了本地文件这种比较low的方式. ...

  4. 模仿QQ音乐wap端

    Net Music https://github.com/ITch8/NetMusic 模仿QQ音乐wap端 实践中来学习Vue技术栈开发 效果图 体验 开发 技术栈 Vue + VueRouter ...

  5. (转载)历史——YouTube 上传第一个视频;网易云音乐正式上线;数字音频播放器的发明者出生

    透过「历史上的今天」,从过去看未来,从现在亦可以改变未来. 今天是 2022 年 4 月 23 日,世界读书日.在 1564 年的这一天,全世界最卓越的文学家之一莎士比亚出生:1616 年的这一天,莎 ...

  6. C语言里的out函数,c语言 vc 用waveout函数写wave文件播放器

    用WaveOut函数写wave文件播放器 要炒菜的话,就得先准备工具,如锅.铲子.炉灶等.对程序来说,就是各种函数的应用.WaveOut函数在windowsAPI中属于低阶接口,用来播放的话需要用到下 ...

  7. 写了一个播放quic的脚本,其他文件单独上传

    写了一个播放quic的脚本 import com.jd.forcebot.toolkit.parameterized.latest.AsciiFileAccessArbitrarily; import ...

  8. 从0开始写一个播放器系列-开篇

    从0开始写一个播放器系列-开篇 阅读本系列博客所需要具备的知识: js, ts , canvas Api , DOM, webpack, 不懂也没有太大的关系, 我会捎带着写出来, 剩下的自行百度 第 ...

  9. Qt5学习 模仿qq音乐播放器样式(1)

    尝试用 Qt做一些小例子才能更好的学习与使用. 看了下网上对于qq音乐的样式没有相关文章,所以慢慢模仿做一个.对于桌面应用,Qt当前更多用于工程项目的控制窗口设计.掌握基本信号与槽,函数使用和简单样式 ...

最新文章

  1. 《MIT科技评论》:2022年全球十大突破性技术
  2. setwindowpos怎么改变z序_置顶窗口SetWindowPos()的用法
  3. Java 中的目录创建处理
  4. 神经网络与深度学习——TensorFlow2.0实战(笔记)(五)(NumPy科学计算库<2>python)
  5. python f.write 保存图片到路径_Python实现生成图片路径和对应标签的方式
  6. java 1.5 代替for循环_J2EE 1.5 提供的另一种形式的for循环
  7. 帝国cms+php7.0+mysql_帝国cms切换php7.x登录后台空白解决方法
  8. 【Tools系列】SecureCRT文件传输模式之Zmodem
  9. 2018年微信数据报告
  10. vue项目运行npm install报错
  11. 夸克服务器过载或暂停维修,服务器过载或CGI脚本出错
  12. java 分号作用_java枚举类型中分号的用法
  13. (十)Redis集群(JedisCluster)Jedis客户端命令详解
  14. HTML+CSS+JS实现 ❤️3D立体魔方小游戏❤️
  15. 住房公积金提取不再难,个人直接通过客户端搞定!
  16. 火狐浏览器谷歌浏览器Edge浏览器修改默认UA(User-Agent)
  17. 谷歌开源漏洞跟踪工具 Monorail 存在跨站点搜索漏洞
  18. 杭电计算机考研复试经验帖
  19. 求满足条件的数(数字和)
  20. 自行车在线租赁管理系统的设计与实现

热门文章

  1. 责任链模式之Tomcat Filter应用
  2. android 原生人脸检测
  3. 能量项链--区间dp典例
  4. android 移动信号,安卓手机怎么增强信号 安卓手机增强信号方法【详解】
  5. Linux nohup指令实现Python代码挂起在后台
  6. 低版本mysql数据导入高版本_将高版本mysql数据库的数据导入低版本mysql中
  7. 苹果站台“下一代高清通话”?都是套路!
  8. RT-ThreadBearPi 开发笔记 -- 小熊派基于RT-Thread使用ESP8266进行网络连接
  9. 拿什么来拯救你——我的时间
  10. 引用-Apache Web服务器安全配置全攻略