iOS视频播放常用重点知识

iOS视频播放常见的重要知识点如下: 视频格式:iOS支持的视频格式主要有H.264、MPEG-4、H.263、Sorenson等。它们根据不同的应用场景进行使用。 视频编解码:视频编解码技术是视频播放的核心,它有两部分组成,1.将原始视频数据编码为压缩格式,2.将压缩格式的数据解码成原始视频数据。在iOS中通常使用系统的AVFoundation框架来实现视频编解码。 视频播放器:iOS中的自带的视频播放器主要为AVPlayer和对AVPlayer进行封装后的AVPlayerViewController,其中AVPlayerViewController封装了视频播放页面常用的播放/暂停,快进/快退,进度条等常用控件。 视频缓存:为了提高视频播放的体验,通常会使用网络缓存,把视频数据缓存到本地来加上视频加载。在iOS中,可以使用NSURLSession和AVAssetDownloadURLSession两种方式实现视频缓存。 视频流媒体:流媒体技术可以将视频数据分片传输,使得视频可以边下载边播放,提高了用户的观看体验。iOS中可以使用HLS(HTTP Live Streaming)协议实现流媒体播放。 视频控制:在视频播放过程中,需要对视频做一些控制操作,比如播放、暂停、快进、快退、全屏等。
视频格式 视频格式是指编码后的视频数据在存储和传输过程中采用的数据格式。iOS中常用的视频格式如下: H.264:是一种高压缩比的视频格式,可以保证视频质量的同时减小视频文件的大小,属于性价比最优的那个,所以是当前使用最广泛的格式。 MPEG-4:是一种高质量的视频格式,支持多种编码算法,包括H.264、MPEG-2等,也支持多种分辨率和帧率,算是一种通用视频格式。 H.263:是一种低码率的视频格式,适合在低带宽网络环境下播放,但视频质量相对较低,手机网页电影经常采用的低清晰度选择。 Sorenson:是一种适用于Flash视频播放的视频格式,支持透明度、动画等特效。
let url = Bundle.main.url(forResource: "video", withExtension: "mp4")!
let playerItem = AVPlayerItem(url: url)
let player = AVPlayer(playerItem: playerItem)
let playerLayer = AVPlayerLayer(player: player)
playerLayer.frame = view.bounds
view.layer.addSublayer(playerLayer)
player.play()
  视频编解码 视频编码/解码主要讲的是将原始视频数据编码为压缩格式,然后将压缩格式的数据解码成原始视频数据,这两个过程。 视频编码是指将视频原始数据保存到本地时,通过压缩算法将其编码为压缩格式的数据。 视频解码是指在播放时将压缩格式数据解码还原为原始视频数据的过程。 视频编解码技术可以有效地减小视频数据的体积,提高视频传输和存储的效率。 iOS是使用系统提供的AVFoundation框架来实现视频编解码。   AVFoundation框架中常用的类: AVAsset:表示一个媒体资源,包括视频、音频等信息。 AVAssetTrack:表示AVAsset中的一个轨道,比如视频轨道、音频轨道。 AVAssetReader:用于读取AVAsset的数据。 AVAssetWriter:用于将数据写入到视频文件中。 AVAssetExportSession:用于将AVAsset导出为另一种格式的媒体文件。 AVAssetReaderTrackOutput:用于从 AVAssetTrack 中读取样本 Buffer 的对象。它通常用于将视频文件中的原始数据读取出来进行处理。 AVAssetWriterInput:是一个将数据写入 AVAssetWriter 的对象。它通常用于将处理后的帧数据写入到新的视频文件中 AVAssetWriterInputPixelBufferAdaptor:是一个将 CVPixelBuffer 写入 AVAssetWriterInput 的对象。它通常用于将处理后的帧数据写入到新的视频文件中。
读取视频文件中的数据, 处理视频帧数据 本地读取视频帧数据的简要流程如下 AVAsset -> videoTrack -> AVAssetReaderTrackOutput -> AVAssetReader -> sampleBuffer 代码举例
let asset = AVAsset(url: videoURL)
let reader = try! AVAssetReader(asset: asset)
let videoTrack = asset.tracks(withMediaType: .video).first!

//输出样本的buffer设置
let outputSettings: [String: Any] = [
    kCVPixelBufferPixelFormatTypeKey as String: Int(kCVPixelFormatType_32BGRA)
]
//从视频轨道中读取buffer样本,并输出出来
let readerOutput = AVAssetReaderTrackOutput(track: videoTrack, outputSettings: outputSettings)
reader.add(readerOutput)
reader.startReading()

while reader.status == .reading {
    if let sampleBuffer = readerOutput.copyNextSampleBuffer() {
        // 处理样本数据
    }
}

处理视频帧数据,将视频数据写入文件

将视频帧数据写入到本地的简要流程如下 pixelBuffer -> AVAssetWriterInputPixelBufferAdaptor -> AVAssetWriterInput -> AVAssetWriter
let writer = try! AVAssetWriter(outputURL: outputURL, fileType: .mp4)
let videoTrack = asset.tracks(withMediaType: .video).first!
//设置写入文件的视频编码
let outputSettings: [String: Any] = [
    AVVideoCodecKey: AVVideoCodecType.h264,
    AVVideoWidthKey: 640,
    AVVideoHeightKey: 480,
]
let writerInput = AVAssetWriterInput(mediaType: .video, outputSettings: outputSettings)
writer.add(writerInput)

let adapter = AVAssetWriterInputPixelBufferAdaptor(assetWriterInput: writerInput, sourcePixelBufferAttributes: outputSettings)
writer.startWriting()
writer.startSession(atSourceTime: CMTime.zero)

while // 读取视频数据 {
    if adapter.assetWriterInput.isReadyForMoreMediaData {
        adapter.append(pixelBuffer, withPresentationTime: // 时间戳)
    }
}

writerInput.markAsFinished()
writer.finishWriting {
    // 导出完成
}
  视频播放器 AVPlayer是iOS中用于播放音频和视频的重要类,它可以播放本地或网络上的音视频资源,可以使用AVPlayer自定义设置播放器界面和播放控制。 AVPlayerViewController是对AVPlayer的封装,提供了常用的播放器控制器界面,用于方便开发,提升开发效率。
/ 本地播放
// let url = Bundle.main.url(forResource: "video", withExtension: "mp4")!
// let playerItem = AVPlayerItem(url: url)
// 网络播放
let url = URL(string: "http://example.com/video.mp4")!
let asset = AVAsset(url: url)
let playerItem = AVPlayerItem(asset: asset)
let player = AVPlayer(playerItem: playerItem)
let playerLayer = AVPlayerLayer(player: player)
playerLayer.frame = view.bounds
view.layer.addSublayer(playerLayer)
player.play()
另外对AVPlayer的其他常见操作还有AVPlayer的pause()、seek(to:)方法,表示暂停、快进;还可以通过KVO监听AVPlayer的状态和播放进度等信息。


AVPlayerViewController提供了常用的播放器控制器界面,包括播放/暂停按钮、播放进度条、播放时间等。可以开箱即用,方便开发。
let playerViewController = AVPlayerViewController()
let url = URL(string: "http://example.com/video.mp4")!
let asset = AVAsset(url: url)
let playerItem = AVPlayerItem(asset: asset)
let player = AVPlayer(playerItem: playerItem)

playerViewController.player = player
present(playerViewController, animated: true, completion: nil)
  视频缓存 为了提高视频播放的体验,通常在视频播放前会先做缓存,然后使用缓存进行播放 NSURLSession和AVAssetDownloadURLSession是iOS中两种常用的网络请求框架,可以用于实现视频缓存。
使用NSURLSession进行缓存
// 创建NSURLSessionConfiguration对象
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
// 设置缓存策略为NSURLRequestReturnCacheDataElseLoad
configuration.requestCachePolicy = NSURLRequestReturnCacheDataElseLoad;
// 创建NSURLSession对象
NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration];
// 创建NSURLRequest对象
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://example.com/video.mp4"]];
// 发起网络请求
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
    if (error) {
        NSLog(@"Error: %@", error);
    } else {
        // 将视频数据保存到本地缓存
        NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0];
        NSString *filePath = [cachePath stringByAppendingPathComponent:@"video.mp4"];
        [data writeToFile:filePath atomically:YES];
        // 播放视频
        AVPlayerViewController *playerViewController = [[AVPlayerViewController alloc] init];
        playerViewController.player = [AVPlayer playerWithURL:[NSURL fileURLWithPath:filePath]];
        [self presentViewController:playerViewController animated:YES completion:nil];
    }
}];
[task resume];
AVAssetDownloadURLSession实现视频缓存 AVAssetDownloadURLSession用于实现后台下载媒体文件,支持断点续传和下载进度的监控。
// 创建AVAsset对象
AVAsset *asset = [AVAsset assetWithURL:[NSURL URLWithString:@"http://example.com/video.mp4"]];
// 创建AVAssetDownloadURLSessionConfiguration对象
AVAssetDownloadURLSessionConfiguration *configuration = [AVAssetDownloadURLSessionConfiguration new];
configuration.maximumActiveDownloads = 1;
configuration.allowsCellularAccess = NO;
// 设置缓存路径为Caches目录下的VideoCache文件夹
NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *cacheFolder = [cachePath stringByAppendingPathComponent:@"VideoCache"];
NSURL *cacheURL = [NSURL fileURLWithPath:cacheFolder isDirectory:YES];
configuration.destinationURL = cacheURL;
// 创建AVAssetDownloadURLSession对象
AVAssetDownloadURLSession *session = [AVAssetDownloadURLSession sessionWithConfiguration:configuration assetDownloadDelegate:self delegateQueue:nil];
// 创建AVAssetDownloadTask对象
AVAssetDownloadTask *task = [session assetDownloadTaskWithURLAsset:asset assetTitle:@"video" assetArtworkData:nil options:nil];
// 启动下载任务
[task resume];



在AVAssetDownloadDelegate协议方法中,做视频播放
当下载完成时,保存视频文件的本地路径,并使用AVPlayerViewController进行播放:
- (void)URLSession:(NSURLSession *)session assetDownloadTask:(AVAssetDownloadTask *)assetDownloadTask didFinishDownloadingToURL:(NSURL *)location {
    // 将视频数据保存到本地缓存
    NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0
  视频流媒体 HLS(HTTP Live Streaming)协议是一种基于HTTP的视频流媒体传输协议,它将视频分割成小段(.ts文件),并通过HTTP协议进行传输,并将这些小段分别下载。这种分段的方式可以保证视频在网络状况不佳的情况下的流畅性和稳定性。 视频流媒体播放器会请求M3U8文件,这个文件包含了所有视频文件的URL地址,播放器会根据这些URL地址逐一请求视频文件,并将这些小段视频拼接成完整的视频流进行播放。 在iOS中,可以使用AVPlayer和AVPlayerViewController实现流媒体播放。下面是一个简单的例子:
import UIKit
import AVFoundation
import AVKit

class ViewController: UIViewController {
    
    var player: AVPlayer!
    var playerLayer: AVPlayerLayer!

    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 创建AVPlayer
        // 这个M3U8文件包含了所有视频文件的URL地址,AVPlayer会根据这些URL逐一请求视频文件并进行播放。
        let url = URL(string: "http://example.com/video.m3u8")!
        player = AVPlayer(url: url)
        
        // 创建AVPlayerLayer
        playerLayer = AVPlayerLayer(player: player)
        playerLayer.frame = view.bounds
        view.layer.addSublayer(playerLayer)
        
        // 播放视频
        player.play()
    }
    
    override func viewWillLayoutSubviews() {
        super.viewWillLayoutSubviews()
        
        // 调整AVPlayerLayer的大小
        playerLayer.frame = view.bounds
    }
}
  视频控制
// 播放/暂停视频
if player?.rate == 0 {
    player?.play()
} else {
    player?.pause()
}

//快进/快退视频:
let seekTime = CMTimeMakeWithSeconds(10.0, preferredTimescale: CMTimeScale(NSEC_PER_SEC))
let currentTime = player?.currentTime()
let targetTime = CMTimeAdd(currentTime!, seekTime)

player?.seek(to: targetTime)

//播放状态发生变化时的回调函数
player?.addPeriodicTimeObserver(forInterval: CMTimeMakeWithSeconds(1, preferredTimescale: CMTimeScale(NSEC_PER_SEC)), queue: DispatchQueue.main, using: { [weak self] (time) in
    // 更新播放进度
})

//播放器状态发生变化时的回调函数
player?.addObserver(self, forKeyPath: "status", options: [.old, .new], context: nil)

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
    if keyPath == "status" {
        if player?.status == .failed {
            // 播放失败
        } else if player?.status == .readyToPlay {
            // 准备播放
        }
    }
}
 

本文转载于网络 如有侵权请联系删除

相关文章

  • Java中Ipv4与Ipv6的转换「建议收藏」

    大家好,又见面了,我是你们的朋友全栈君。IPConvert.java类的主要作用是将ip(ipv6\ipv4)转换成16个字节的数组,其中ipv4的转换是先将v4地址转换成v6再转换成长度是16的字节数组packagecom.cvicse.naba.common.utils; /** * *描述: *<p> *&nbsp;&nbsp;&nbsp;&nbsp;ip转换byte数组管理类。 *</p> *创建日期:2012-7-25下午3:34:00<br> * *@author:Wendy<br> *@update:$Date:2012-07-2518:14:40+0800(Wed,25Jul2012)$<br> *@version:$Revision:779$<br> *@since1.0.0 */ publicclassIPConvert{ privatestaticfinalintIPV6Length=8;//IPV6地址的分段 privatestaticfinalintI

  • C++课程设计:图书管理系统【附源码】

    课程设计目的  作为软件工程和计算机科学与技术专业的基本课程,课程设计不仅涵盖了C++语言的知识体系,又与工程的实际需要切实相关。通过课程设计的综合性训练,对开发者解决实际问题能力,编程能力,动手能力有很大的提升,更有助于样成良好的编程习惯。图书管理系统需求分析  某高校为更好的管理图书馆,现需设计一简易图书管理系统,实现新书录入,图书资料查询,显示总图书信息功能。要求开发的系统需要具备以下功能:   1.实现读者借阅图书;   2.实现读者归还图书;   3.实现对图书信息的综合管理:     (设置二级子目录实现信息的增,删,改,查等操作)   4.实现对读者信息的综合管理:     (设置二级子目录实现信息的增,删,改,查等操作)   5.显示用户信息:显示所有用户信息,含学号、姓名、借阅状况等信息;   6.返回主界面;设计实现  本部分设计内容包括:类的设计、数据成员设计、成员函数设计,以及主程序设计(模块函数实现,主函数)【源码中详细解释,此处不作赘述】 头文件book.h#pragmaonce//包含此语句的文件只会被编译一次,表示在编译时,该文件只被包含一次,减少整个编

  • 构建云原生权限的5个最佳实践

    随着复杂性的增加以及客户和安全需求的不断涌现,以一种为未来做好准备且不需要大量重构或重写的方式构建产品的访问控制至关重要。本文介绍了构建云原生权限的五个最佳实践,这些实践可以为开发人员减少很多麻烦。基于云原生/微服务的产品很复杂,为这些产品构建访问控制和管理权限也很复杂。而且每次拉取请求只会让情况变得更糟。大多数开发人员最终都会为他们的产品多次构建授权或访问控制,他们被迫根据每个新客户、产品或安全需求进行重构。为了让人们的工作和生活更轻松,需要了解构建云原生权限带来的独特挑战,并了解构建云原生权限的五个最佳实践,这些实践可以为开发人员减少很多麻烦。应用程序和访问权限已更改开发人员在过去使用带有授权或访问控制的单一框架(如Django或Spring)来构建授权,但当创建云原生应用程序时,这些不再适用。这有几个原因。首先,应用程序本身不再是单一的——它们基于微服务并且正在变得高度分散。当开发人员需要合并部署在边缘,并且通常也需要访问控制的设备或实例时,这一点也值得引起注意。其次,云原生应用程序往往需要集成第三方服务(例如计费、身份验证、数据库、分析等),并且除了开发人员自己的应用程序的微服

  • CUDA 04 - 同步

    同步栅栏同步是一个原语,在很多并行编程语言中都很常见.在CUDA中,同步可以在两个级别执行:系统级:等待主机和设备完成所有工作.块级:在设备执行过程中等待一个线程块中所有线程到达同一点.对于主机来说,由于需要CUDAAPI调用和所有点的内核启动不是同步的,cudaDeviceSynchonize函数可以用来阻塞主机应用程序,直到所有CUDA操作(复制,核函数等)完成:cudaError_tcudaDeviceSynchronize(void);复制这个函数可能会从先前的异步CUDA操作返回错误,因为在一个线程块中线程束以一个为定义的顺序被执行,CUDA提供了一个使用块局部栅栏来同步他们的执行的功能,使用下述函数在内核中标记同步点:__device__void__syncthreads(void);复制当__syncthreads被调用时,在同一个线程块中每个线程都必须等待直至该线程块中所有其他线程都已经达到这个同步点.在栅栏之前所有线程产生的所有全局内存和共享内存访问,将会在栅栏后对线程块中所有其他的线程可见.该函数可以协调一个块中线程之间的通信,但他强制线程束空闲,从而可能对性能产生

  • 图神经网络框架DGL v0.4.3 新版本发布

    DGL团队昨天发布了DGLv0.4.3版本,这个版本无论是针对DGL系统的易用性还是性能,都做出了许多重要改进。主要亮点如下:DGL开始支持TensorFlow后端;发布DGL-KE:高性能、易使用、可扩展的大规模知识图谱嵌入学习框架;发布DGL-LifeSci:面向化学和生物领域的GNN算法库;发布新的图采样API。详细信息如下TensorFlow后端DGL在这个版本开始正式拥抱TensorFlow社区,用户可以很容易地将DGL后端切换到TensorFlow。如果你是第一次使用,在安装完DGL并使用importdgl导入后,就可以按照交互命令自动设置默认的后端。你也可以通过修改~/.dgl目录下的config.json文件来修改后端引擎。对于用户来说,使用DGL并不需要关心当前后端采用的是哪一个引擎。如下代码展示了如何在DGL中使用graphconvolutionlayer.importtensorflowastf importdgl.nnasdglnn #Randomfeaturesfor10nodes;eachisoflength5. x=tf.random.normal((1

  • Android基于IJKPlayer视频播放器简单封装设计

    播放器的简单设计播放器基于IJKPlayer来设计的,播放器大致分三层1.播放内核(基于ijkMediaplayer)2.播放器View3.播放器的MediaController1、封装播放内核我们都知道需要播放一个视频需要三个过程1.createMediaPlayer2.MediaPlayerprepare3.MediaPlayer与Surface绑定xinvideoplayer中使用了VideoManager来控制ijkmediaplayer所有的操作三个过程我们使用HandlerThread+Hander来实现第一个过程创建大致可能需要100ms左右,严重影响UI线程!!!第一个过程:createMediaPlayernewIjkMediaPlayer()设置一些播放器回调方法//IJK的Mediaplayerapi类似Android系统播放器api //IMediaPlayer.class publicinterfaceIMediaPlayer{ voidsetOnPreparedListener(IMediaPlayer.OnPreparedListenervar1);//p

  • Android网格布局GridView学习使用

    应用开发的时候,有时我们需要将一些图片进行预览,例如:相片管理的应用。这个时候用ListView的话就显得不是太合适了,因为ListView的展现形式毕竟不适合这种预览要求,那么通过什么视图组件可以实现呢?这里就可以使用GridView,android中的网格布局来实现了。GridView控件用于把一系列的控件组织成二维网格的形式显示出来,应用较多的也就是图片的组合显示了。关于GridView的使用直接看例子程序。先看效果图:具体实现方式如下:主布局文件main.xml<?xmlversion="1.0"encoding="utf-8"? <GridViewxmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/gridview" android:layout_width="fill_parent" android:layout_height="fill_parent&q

  • 绘制散点图(克利夫兰系列)

    1导入数据library(reshape2) >p<-file.choose() >df<-read.csv(p,sep=",",na.strings="NA",stringsAsFactors=FALSE) >df CityFemaleMale 1Acapulco2565.512595.80 2Bellingham453.36539.27 3BeverlyHills5050.465269.71 4Bremerton5269.895705.00 5Camacho3643.302154.15 6Guadalajara290.99232.33 7Hidalgo7361.043951.73 8LosAngeles6014.646281.53 9Merida4770.143970.31 10MexicoCity1255.171233.14 11Orizaba3531.852713.37 12Portland5612.436314.17 13Salem9416.678795.17 14SanAndres3458.544747.

  • EMR(弹性MapReduce)入门之腾讯云存储对象COS(六)

    在前面的几篇文章中大家已经跟着我了解了HDFS以及HDFS的一些基础排障,接下来我们呢继续学习。要学习到的产品是腾讯云产品中的对象存储COS。那么首先就会想到,HDFS和COS都是存储,那COS的产生背景是什么?HDFS的不足之处:一,低延迟数据访问1,比如毫秒级2,低延迟与高吞吐率二,小文件存取1,占用NameNode大量内存2,寻道时间超过读取时间三,并发写入,文件随机修改1,一个文件只能有一个写者2,仅支持appendCOS产生的背景COS产生的背景其实就是结合HDFS的短板和未来大数据存储的需求产生的。大数据存储的需求:1、结构化数据、非机构化数据2、热数据、冷数据3、不同版本Hadoop的一致性COS商品简介对象存储(CloudObjectStorage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持HTTP/HTTPS协议访问的分布式存储服务。腾讯云COS的存储桶空间无容量上限,无需分区管理,适用于CDN数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。COS的存储类型1.jpgCOS的功能断点续传就是信号中断后(掉线或关机等),下次

  • HTML5版的String Avoider小游戏

    HTML5版的StringAvoider小游戏 http://www.newgrounds.com/portal/view/300760 蛮简单也蛮考验耐心,从游戏起始点移动鼠标到终点位置,鼠标移动过程绘制出移动轨迹的String平滑曲线,整个过程不能碰撞到边界,从技术角度来说其核心就是根据鼠标移动位置生成String线的算法,该游戏是ActionScript写的Flash版,这里将其改造成HTML5版的JavaScript实现,并增加可自定义关卡功能的一种设计思路。String连线我是缓存了300个点信息的数组,鼠标移动时不断调整300个点的新位置信息,每次更新时先将新鼠标点设置给第一个元素,后续更新x点时,计算其与x-1点的角度,在此方向长度为1的位置更新坐标,这样就达到了平滑曲线的效果。除了绘制String线外还有个技术点就是监测碰撞,该Flash游戏的边界都是线段,因此第一想到的监测方式就是线线相交的思路,算法可参考 http://en.wikipedia.org/wiki/Line%E2%80%93line_intersection ,如果以LineLine的相交思路只需要遍

  • 22. 对比最优误差率

    在我们的猫咪识别实例中,这个“想法”的错误率指的是——最优分类器的错误率接近0%,就像一个人可以很轻松的识别它。而且随时可以进行识别,我们希望机器也可以做到这点。 还有一些问题是比较困难的。例如:假设你建立了一个语音识别系统,并且发现有14%的音频杂音非常多,即使一个人也很难听出音频中在说什么。在这种情况下,这个“最优的”语音识别系统的误差大约为14%。 假设在这个语音识别系统中,你的算法效果如下: •在训练集上的误差=15% •在开发集上的误差=30% 在训练集上的效果接君最优误差14%。因此,在偏差和训练集上面进行改进是不会取得太大的效果的。然而这个算法并不适用于开发集;因此,由于方差的原因,在这里有很大的改进空间。 这个例子于上一章节的第三个例子类似,它有在训练集上有15%的误差,在开发集上有30%的误差。如果最优分类器的误差接近于0%的话,则训练集上有15%的误差改进空间非常大,减少偏差是非常有效的。但是如果最优错误率约为14%,那么近乎相同的训练集的数据告诉我们我们分类器是很难提高的。 对于最优错误率远大于0%的问题,这里有一个关于算法错误的更详细的分类。我们继续使用上面的语

  • 干货分享 | 深度学习零基础进阶第二弹

    图片来自wiki昨天,雷锋网编译了《干货分享|深度学习零基础进阶大法!》,相信读者一定对深度学习的历史有了一个基本了解,其基本的模型架构(CNN/RNN/LSTM)与深度学习如何应用在图片和语音识别上肯定也不在话下了。今天这一部分,我们将通过新一批论文,让你对深度学习的方式与深度学习在不同领域的运用有个清晰的了解。由于第二部分的论文开始向细化方向延展,因此你可以根据自己的研究方向酌情进行选择。本文对每篇论文都增加了补充介绍,分上下两篇,由老吕IO及奕欣编译整理,未经雷锋网许可不得转载。1.深度学习模型Hinton与Geoffrey等技术专家合著的《Improvingneuralnetworksbypreventingco-adaptationoffeaturedetectors》也很有指导意义。论文提出,在训练神经网络模型时,如果训练样本较少,为了防止模型过拟合,Dropout可以作为一种trikc供选择。[1]https://arxiv.org/pdf/1207.0580.pdf关于Dropout,Srivastava与Nitish等技术专家也合著过《Dropout:asimplew

  • vite2

    vite.js官网地址创建项目切记,目录中不要带有中文,会报错npminit@vitejs/app //需要输入项目名称 //例如demo-app demo-app //进入文件夹 cd./demo-app //安装依赖 npminstall //启动项目 npmrundev复制vite配置插件的方式使用vue/react vite.config.jsexportdefault{ alias:{ "@":resolve("src"), "comps":resolve("src/components"), "apis":resolve("src/apis"), "views":resolve("src/views"), "utils":resolve("src/utils"), "routes":resolve("src/routes"), "

  • 520表白季,教你用matlab画动态心形曲线图,可自动保存GIF格式图片,送给女朋友,她们一定会惊讶,赶紧收藏!!!

    昨天发表了一篇用python教你画心形图表白的文章: 想要表白的看这里,教你用python画不同类型的心形图虏获芳心,值得收藏!! 里面详细介绍了各种心形图的画法以及最终的表白神器,值得点赞收藏!!同样matlab也可以实现相同的功能并且还可以做得更好,今天就用教你用matlab画动态心形曲线图,不信请看下面:虏获芳心matlab画动态心形曲线图matlab画动态心形曲线图(基础版)matlab画3D心形图备注matlab画动态心形曲线图利用数学上的格式f(x)=x^2^/^3+e/3*(π-x^2)^1^/^2*sin(a*π*x)可以为你展现非常完美的图像。%matlab动态心形曲线(保存GIF格式) clc;clearall; a=10; x=-2:0.01:2; figure(1); set(gcf,'position',[0,0,800,600],'color','w'); fori=1:100 str_title=strcat('\color{red}a=',num2str(a)); y=abs

  • w3cschool-MyBatis-Plus 插件

    https://www.w3cschool.cn/mybatis_plus/mybatis_plus-udwn3mgc.html MyBatis-Plus(简称MP)是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生。 特性 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑 损耗小:启动即会自动注入基本​CURD​,性能基本无损耗,直接面向对象操作 强大的​CRUD ​操作:内置通用​Mapper​、通用​Service​,仅仅通过少量配置即可实现单表大部分​CRUD ​操作,更有强大的条件构造器,满足各类使用需求 支持​Lambda​形式调用:通过​Lambda ​表达式,方便的编写各类查询条件,无需再担心字段写错 支持主键自动生成:支持多达4种主键策略(内含分布式唯一ID生成器-​Sequence​),可自由配置,完美解决主键问题 支持​ActiveRecord ​模式:支持​ActiveRecord ​形式调用,实体类只需继承​Model​类即可进行强大的​CRU

  • 当 Go struct 遇上 Mutex

    struct是我们写Go必然会用到的关键字,不过当struct遇上一些比较特殊类型的时候,你注意过你的程序是否正常吗? 一段代码 typeURLstruct{ Ipstring Portstring mux sync.RWMutex paramsurl.Values } func(c*URL)Clone()URL{ newUrl:=URL{} newUrl.Ip=c.Ip newUrl.params=url.Values{} returnnewUrl } 复制 这段代码你能看出来问题所在吗? A:程序正常 B:编译失败 C:panic D:有可能发生datarace E:有可能发生死锁 复制 如果你看出来问题在哪里的话,那我再悄悄告诉你,这段代码是github某3kstarGo框架的底层核心代码,那你是不是就觉得这个话题开始有意思了? 先说结论 上面那段代码的问题是sync.RWMutex引起的.如果你看过有关sync相关类型的介绍或者相关源码时,在sync包里面的所有类型都有句这样的注释:mustnotbecopiedafterfirstuse,可能很多人却并不知道

  • CentOS 设置mysql的远程访问

    好记性不如烂笔头,记录一下。 安装了MySQL默认是拒绝远程连接的。 首先进入数据库,使用系统数据库mysql。 mysql-uroot-p#回车,然后输入则使用了系统数据库mysql-uroot@localhost-p#密码为空复制 接着对系统数据库的root账户设置远程访问的密码,与本地的root访问密码并不冲突 grantallprivilegeson*.*to'账户名'@'%'identifiedby'密码'withgrantoption;flushprivileges;复制 #123456为你需要设置的密码复制 防火墙设置一下,不然3306端口还是无法访问(firewall版本防火墙,需要使用firewall防火墙相关命令,具体可以参考:https://www.cnblogs.com/gougou1981/p/14292622.html) 1iptables-IINPUT-ptcp-mstate--stateNEW-mtcp--dport3306-jACCEPT复制 设置完之后,查看一下是否能通过。 1iptables-L-n复制 如果想要限制访问。 ip

  • 常用excel函数语法及说明

      一、文本函数: 1、LEN 语法:LEN(text) 说明:返回文本字符串中的字符数。 =LEFT(A1,LEN(A1)-1)删除A1单元格中的最后一位。 2、FIND 语法:FIND(find_text,within_text,start_num) 说明:用于查找其他文本字符串(within_text)内的文本字符串(find_text),并从within_text的首字符开始返回find_text的起始位置编号。也可使用SEARCH查找其他文本字符串中的某个文本字符串,但是,FIND和SEARCH不同,FIND区分大小写并且不允许使用通配符。 3、LEFT 语法:LEFT(text,num_chars) 说明:基于所指定的字符数返回文本字符串中的第一个或前几个字符。 4、RIGHT 语法:RIGHT(text,num_chars) 说明:根据所指定的字符数返回文本字符串中最后一个或多个字符。 5、MID 语法:MID(text,start_num,num_chars) 说明:返回文本字符串中从指定位置开始的特定数目的字符,该数目由用户指定。 6、CONCATENATE

  • 异常处理

    1.什么是异常: #error: 语法错误 比较明显的错误 在编译的时候就能检测(可以规避的语法错误) #iteration: 异常 在执行代码过程中引发的异常(异常处理的对象) 怎样查看报错信息:Traceback(错误的追踪信息) 程序出错,一般看做后一行的代码错误,行数最少的一条信息; 2.简单的异常 l=['登录','注册','退出'] foriinenumerate(l,1): print(i[0],i[1]) try: num=int(input('num:')) print(l[num-1]) exceptValueError: print('请输入一个数字') exceptIndexError: print('您输入的数字无效')复制 这样的处理只能针对单个异常,你是哪种异常就会自动跳到哪一层;   1AttributeError试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x 2IOError输入/输出异常;基本上是无法打开文件 3ImportError无法引入模块或包;基本上是路径问

  • Bzoj4558:分类讨论 计算几何 组合数学

    国际惯例的题面: 这题让我爆肝啦......这种计数显然容斥,正好不含任何坏点的我们不会算,但是我们能算至少含零个坏点的,至少含一个坏点的,至少含两个坏点的......所以最终的答案就是(至少含零个坏点的-至少含一个坏点的+至少含两个坏点的-至少含三个坏点的+至少含四个坏点的)。然后就是怎么计算的问题。对于至少含零个坏点的,我们不妨设定所有点都是好点。对于非正放的正方形,我们能找到一个正好包含它的最小的正放的正方形,显然这样的正方形是唯一的。 然后我们让四个点在这个正方形的边上滑动,显然这四个点的每一组位置对应一个非正放的正方形(虽然正好在四个角上的是正放的)。于是我们可以得出总方案数为sigma(ifrom1tomin(n,m))i*(n-i+1)*(m-i+1)。这个东西可以O(n)计算。对于正好有一个坏点的,我们考虑某个以某个个点P为角的正方形A,点P一定包含这个正方形A的最小正放正方形的角上或边上。 于是我们枚举这样的正方形和点P能在的位置数量就好了。对于点P的状态,我们计算出它距离左边界的距离l,右边界距离r,上边界距离h。 然后我们令t=min(l+r,h)。如果我们不考

  • 网络变压器

    网络变压器简介编辑 网络变压器具体有T1/E1隔离变压器;ISDN/ADSL接口变压器;VDSL高通/低通滤波器模块、接口变压器;T3/E3、SDH、64KBPS接口变压器;10/100BASE、1000BASE-TX网络滤波器;RJ45集成变压器;还可根据客户需要设计专用变压器。产品主要应用于:高性能数字交换机;SDH/ATM传输设备;ISDN、ADSL、VDSL、POE受电设备综合业务数字设备;FILT光纤环路设备;以太网交换机等等,如裕泰电子的YL18-2050S,YL18-3002S等比较常见! 数据泵是消费级PCI网卡上都具备的设备,数据泵也被叫做网络变压器或可称为网络隔离变压器。 它在一块网卡上所起的作用主要有两个,一是传输数据,它把PHY送出来的差分信号用差模耦合 的线圈耦合滤波以增强信号,并且通过电磁场的转换耦合到不同电平的连接网线的另外一端;一 是隔离网线连接的不同网络设备间的不同电平,以防止不同电压通过网线传输损坏设备。除此 而外,数据汞还能对设备起到一定的防雷保护作用。 网络变压器在以太网中的作用编辑 在以太网设备中,通过PHY接RJ45时,中间都会加一个网络变

相关推荐

推荐阅读