首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在dispatch_async中从AVURLAsset获取视频时长时,UI被阻止

的原因是因为dispatch_async是在后台线程执行的,而UI更新必须在主线程进行。AVURLAsset获取视频时长的操作是一个耗时操作,如果在dispatch_async中执行,会导致UI被阻塞,用户无法进行其他操作。

为了解决这个问题,可以使用dispatch_async将获取视频时长的操作放在后台线程中执行,然后在主线程中更新UI。具体的做法是,在dispatch_async中获取视频时长后,使用dispatch_async将更新UI的操作放在主线程中执行。

以下是一个示例代码:

代码语言:txt
复制
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    AVURLAsset *asset = [AVURLAsset URLAssetWithURL:videoURL options:nil];
    CMTime duration = asset.duration;
    NSTimeInterval durationInSeconds = CMTimeGetSeconds(duration);
    
    dispatch_async(dispatch_get_main_queue(), ^{
        // 在主线程中更新UI,例如显示视频时长
        self.durationLabel.text = [NSString stringWithFormat:@"视频时长:%d秒", (int)durationInSeconds];
    });
});

在这个示例中,我们使用dispatch_async将获取视频时长的操作放在后台线程中执行。然后,在获取到视频时长后,使用dispatch_async将更新UI的操作放在主线程中执行,确保UI的更新不会阻塞。

对于AVURLAsset获取视频时长的优势是它可以方便地获取视频的时长信息,应用场景包括视频播放器、视频编辑器等需要获取视频时长的应用。腾讯云相关产品中,可以使用腾讯云点播服务(https://cloud.tencent.com/product/vod)来存储和管理视频文件,并提供了丰富的视频处理功能,包括获取视频时长、转码、截图等。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

QQ音乐开发,探讨如何利用腾讯云SDK直播中加入视频动画

01 产品经理给的需求说起 “开场动画?插播广告?” 不久之前,产品同学说我们要在音视频直播,加一个开场动画。 ? 要播放插播动画,怎么做呢?对于视频直播来说,当前直播画面流怎么处理?...,在编码上行到服务器之前,会提供一个接口给予业务侧做预处理的回调,所以,对于视频直播,我们可以利用这个接口,把上行输入的视频画面修改为要插播进来动画的视频帧,这样,观众角度看,插播了视频动画。...仅仅使用第二种方式就能够满足同时视频两种直播插播动画的需求,但是实际实践的时候发现,如果要播放外部输入流,必须要先关闭摄像头画面。...另外一个问题是摄像头采集上来的数据,是下图的角度为1的图像,渲染的时候,会默认旋转90度,更改视频画面,需要保持两者的一致性。...绘制,可以根据数据格式来判断是否需要旋转图像展示。 ? 2.ffmpeg 转h264裸流解码问题 iOS8开始,苹果开放了VideoToolBox,使得应用程序拥有了硬解码h264格式的能力。

2.8K10

iOS视频播放的基本方法

而值得注意的是,上述的MPMoviePlayerController与MPMoviePlayerViewControlleriOS9.0之后弃用。...使用AVPlayer需要了解的常用类 AVAsset:一个用于获取多媒体信息的抽象类,但不能直接使用 AVURLAsset:AVAsset的子类,可以根据一个URL路径创建一个包含媒体信息的AVURLAsset...获取当前播放时间与总时间 在此之前我们需要首先了解一个数据类型,也就是上述操作的CMTime, AVPlayer的使用我们会经常用到它,其实CMTime是一个结构体如下: typedef...所以获取视频的总时长(秒)需要duration.value/duration.timeScale。...,是检测播放状态变为AVPlayerStatusReadyToPlay的时候获取的 //视频时长AVPlayerItem状态为AVPlayerStatusReadyToPlay获取 CMTime

4.2K20

视频UGC常见问题(FAQ)

录制设置 BGM,endTime 没有完成回调 如果设置的 endTime 小于音乐文件总时长,4.6 及之前的版本是 BGM 播放完后才会触发完成回调, 4.7 版本开始 endTime 触发完成回调...注意 预处理进行裁剪了,生成完的预处理视频最后生成前,一定要将裁剪时长设置为整个视频时长,不然还会再次进行裁剪。...; 2)、SDK版本5.3版本及以后的版本建议使用系统接口获取音乐时长,因为SDK接口getVideoInfoWithAsset是给视频使用的,如果调用这个接口传音乐路径获取的音乐时长会为0,可以参考以下系统接口代码...视频上传功能 TXUGCPublish 找不到? 视频上传模块 SDK 独立出来,并开源到 Demo ,需要客户去集成短视频上传。 1). 下载Demo 2)....客户端执行上传操作,必须携带该签名,让腾讯云点播验证客户端的上传是否授权。 客户端上传签名的生成包括以下三步,详情参见文档: 1). 获取 API 密钥; 2). 拼接明文串; 3).

3.9K43

AVFoundation框架解析看这里(2)- 媒体捕捉与视频拍摄

前言 AVFoundation框架是ios很重要的框架,所有与视频音频相关的软硬件控制都在这个框架里面,接下来这几篇就主要对这个框架进行介绍和讲解。...几个简单的需求例子: 扫一扫:通过捕捉媒体,获取扫描内容,识别二维码或条形码 拍照:通过捕捉媒体,拍摄照片 录像:通过捕捉媒体,录制视频 Demo以录像为需求,通过AVCapture捕捉到画面后,使用对应输出源的数据...AVCaptureSession AVCaptureSession:媒体(音、视频)捕获会话,负责把捕获的音视频数据输出到输出设备。一个AVCaptureSession可以有多个输入输出。...视频捕获,客户端可以实例化AVCaptureSession并添加适当的AVCaptureInputs、AVCaptureDeviceInput和输出,比如AVCaptureMovieFileOutput..." //获取权限后展示UI,判断照相机和麦克风权限 RRXCAuthorizeManager.authorization(.camera) { (state

1.1K20

iOS AVDemo(7):视频采集,视频系列来了丨音视频工程示例

代码上可以看到主要有这几个部分: 1)创建采集设备 AVCaptureDevice。 -captureDevice 实现。...3)创建采集视频数据输出 AVCaptureVideoDataOutput。 -videoOutput 实现。... -previewLayer 实现。 该 layer 可以外层获取用于 UI 布局和展示。 6)基于采集会话的能力封装开始采集和停止采集的对外接口。...2、采集视频并实时展示或截图 我们一个 ViewController 来实现视频采集并实时预览的逻辑,也提供了对采集的视频数据截图保存到相册的功能。...这主要是为了方便后面截图转换数据。 2) -videoCapture 初始化采集器,并实现了采集会话初始化成功的回调、采集数据回调、采集错误回调。

81430

iOS多线程之三:GCD的使用

运行的main主线程,一般用于UI的搭建) 这两种公共队列的调用便可以解决关于后台执行任务、主线程用于更新UI界面的问题,代码如下: dispatch_async(dispatch_get_global_queue...GCD源码可以查到QOS_MIN_RELATIVE_PRIORITY等于-15。 2.4、串行队列和并行队列 串行队列指同一间每次只能执行一个任务。...runLoop执行,所以比如在每隔1/60秒执行的RunLoop,block最快在三秒后执行,最慢3秒+1/60秒后执行,并且main dishpatch queue有大量追加处理货主线程本身的任务处理有延迟...Paste_Image.png 从上面代码可以看出 第一个参数predicate,该参数是检查后面第二个参数所代表的代码块是否调用的谓词, 第二个参数则是整个应用程序只会被调用一次的代码块。...,因此这两个函数会阻塞当前线程,主线程调用这两个函数必须小心,可能会阻止事件处理循环并无法响应用户事件。

2.9K20

视频面试题集锦(第 13 期)

下面是第 13 期面试题精选: 1、AVPlayer 如何实现视频片段加速预览播放? 2、如何高效获取一个视频的关键帧序列? 3、SPS 和 PPS extradata 的作用是什么?...什么情况下 I 帧不是 IDR 帧? 1、AVPlayer 如何实现视频片段加速预览播放?... extradata ,SPS 和 PPS 的作用是为解码器提供视频序列的配置信息,以确保解码器能够正确地解释和处理视频数据。...当解码器接收到 IDR 帧,它会清除之前的解码状态,确保该帧开始解码,从而避免错误传播。IDR 帧通常用于视频序列的随机访问点,以及视频传输或存储中用于错误恢复。...所以右数第一个 I 帧接受,不能刷新解码器,否则上一个 GOP 的 B 帧无法成功解码,可能会出现花屏或者报错。

20310

AVFoundation框架解析看这里(7)- AVAssetImageGenerator

AVFoundation框架是ios很重要的框架,所有与视频音频相关的软硬件控制都在这个框架里面,接下来这几篇就主要对这个框架进行介绍和讲解。...很多视频软件,基本都会提供跟随鼠标进度显示画面,裁剪视频预览关键帧等功能,实际上,这种类似的功能都是AVAssetImageGenerator的功劳。...throws -> CGImage /* * 生成一系列图片 * requestedTimes: NSValue类型的数组,数组里每一个对象都是CMTime结构体,表示你想要生成的图片在视频的时间点...typealias SplitVideoBlock = ([UIImage]) -> () //获取视频帧后的回调 /* 按照指定的帧率,把视频文件拆成图片...返回AVAssetImageGenerator,能够取消 */ @discardableResult class func splitVideo(asset: AVURLAsset

1.2K30

AVFoundation框架解析看这里(6)- AVAssetExportSession

AVFoundation框架是ios很重要的框架,所有与视频音频相关的软硬件控制都在这个框架里面,接下来这几篇就主要对这个框架进行介绍和讲解。...相关,AVAssetExportSession可以以指定导出预设所描述的形式现有AVAsset的内容创建新的定时媒体资源。...export不会较小的尺寸缩放较大尺寸的视频视频将使用H.264压缩和音频将使用AAC进行压缩。....m4a文件,其中包含适当的iTunes无间隙播放数据 public let AVAssetExportPresetAppleM4A: String //下面的导出选项将使所有轨道的媒体完全按照存储源资源的方式传递到...: 裁剪时长 completedBlock: 裁剪完成后的回调 */ class func tailoringVideo(asset: AVURLAsset, outputName: String

1.3K20

多媒体-图片、音频、视频压缩

** Iphone上有两种读取图片数据的简单方法 **UIImageJPEGRepresentation和UIImagePNGRepresentation.** UIImageJPEGRepresentation...context创建一个改变大小后的图片 UIImage* scaledImage = UIGraphicsGetImageFromCurrentImageContext(); // 使当前的context...Snip20161127_1.png 可以看的出 相同时长 wav格式的内存是最大的,mp3编码格式的文件占用的内存是最小的,10倍的差别 使用libmp3lame 进行MP3编码格式的转码 ?...int read, write; FILE *pcm = fopen([cafPathStr cStringUsingEncoding:1], "rb"); //source 转换的音频文件位置...以2s为例 未经压缩的视频大小有 8968k 而经过压缩的视频长度有 240k,俩者差了 40多倍 # iOS录制的视频是mov格式的,安卓和PC不支持,因此要转换成MP4,并且要压缩。

1.7K10

屏幕成像原理以及FPS优化Tips

GPU 向 Back Buffer 写数据,屏幕 Frame Buffer 读数据。...屏幕进入下一个刷新周期 Frame Buffer 取出的是“老”数据,而非正在产生的帧数据,即两个刷新周期显示的是同一帧数据。...对此你应用,应该尽量减少不必要的属性修改。 视图无交互尽量使用CALayer,比如使用CALayer代替UIView\UILabel\UIImageView。...cell的layoutSubViews方法布局代码太多比较耗时。 如果一个对象(比如subview)父对象init就要创建,那么避免使用懒加载的方式。...这里有一个背景:屏幕视频控制器只会屏幕对应的帧缓存中一帧一帧的取数据,而不会其他的缓冲区取数据,所以我们想把其他缓冲区(也就是屏幕外缓冲区)的内容显示到屏幕上,需要把屏幕外缓冲区渲染的结果提交到屏幕的缓冲区

9.4K73

iOS 开发--怎样高效的使用多线程

YYKit 异步绘制使用这段代码,这是一个任务不算多、耗时较长的场景,所以是比较适合的。...当然,为了避免线程饿死,系统会逐步提高“冷落”线程的优先级,IO 密集型线程通常情况下比 CPU 密集型线程更容易获取到优先级提升。...懒加载任务 既然 UI 组件必须在主线程初始化,那么就需要用时再初始化吧,swift 的写复制也是类似的思路。...block 的任务延迟到主线程空闲再执行,不过也不适合计算量过大的任务,因为始终是主线程嘛。...5、编译器的过度优化 编译器可能会为了提高效率将变量写入寄存器而暂时不写回,方便下次使用,我们知道一句代码转换为指令不止一条,所以变量写入寄存器没来得及写回的过程,可能这个变量其它线程读写了。

92940

iOS 如何高效的使用多线程

所以开发可以控制一下线程的数量,达到优化性能的目的。...当然,为了避免线程饿死,系统会逐步提高“冷落”线程的优先级,IO 密集型线程通常情况下比 CPU 密集型线程更容易获取到优先级提升。...1、避免死锁 一种场景是:同一线程重复获取可能会导致死锁,这种情况可以使用递归锁来处理,pthread_mutex_t使用pthread_mutex_init_recursive()方法初始化就能拥有递归锁的特性...还有一种场景是:A线程获取到a锁,B线程获取到了b锁,同一刻,A线程想要获取b锁,B线程想要获取a锁,A、B线程就会同时进入休眠。...4、编译器的过度优化 编译器可能会为了提高效率将变量写入寄存器而暂时不写回,方便下次使用,我们知道一句代码转换为指令不止一条,所以变量写入寄存器没来得及写回的过程,可能这个变量其它线程读写了。

1.7K30

多媒体-图片、音频、视频的基本实现

setCategory:error:实例方法,来IOS应用可用的不同类别作出选择。...完全下载后才播放就不能算在线播放了 所有苹果公司提供了功能强大的AVPlayer,AVPlayer存在于AVFoundation,其实它是一个视频播放器,但是用它来播放音乐是没问题的,当然播放音乐不需要呈现界面...[[AVPlayer alloc] initWithURL: [NSURL fileWithString:urlStr]]; //本地 #或者通过 playItem 进行初始化 #获取在线音频文件的时长...#每个cell都需要获取时长的话, Tb滑动的时候会有明显的卡顿现象。...使用GCD多线程可以解决这个问题 //使用多线程解决每个cell获取时长造成的卡顿现象 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT

2K10

从零开始学 Web 之 HTML5(四)拖拽接口,Web存储,自定义播放器

--h5,如果想拖拽元素,就必须为元素添加draggable="true"....2、浏览器默认会阻止目标元素的 ondrop 事件:我们必须在目标元素的 ondragover 阻止浏览器的默认行为(使用事件参数对象的 preventDefault()方法),才能将拖拽的元素放到目标元素...--h5,如果想拖拽元素,就必须为元素添加draggable="true"....注意:sessionStorage 的存储特点: 这个数据本质是存储在当前页面的内存,意味着其它页面和浏览器无法获取数据。 它的生命周期为关闭当前页面,数据会自动清除。...常用属性: currentTime:视频播放的当前进度 duration:视频的总时长 paused:视频播放的状态 常用事件: oncanplay:事件在用户可以开始播放视频/音频出触发 ontimeupdate

1.5K20

iOS AVDemo(4):音频解封装, MP4 解封装出 AAC丨音视频工程示例

当外部向解封装器要数据而触发数据加载,会把解封装后的数据先缓存到这两个队列,缓冲的采样数不超过 KFMP4DemuxerQueueMaxCount,以减少内存占用。 3)视频输出源读取数据。...核心逻辑 -_loadNextSampleBuffer 方法实现:输出源 readerAudioOutput 和 readerVideoOutput 读取数据放入缓冲区队列 _audioQueue... -_resumeLastTime 方法实现。 5)停止解封装。 -cancelReading 方法实现。 6)解封装状态机管理。...2、解封装 MP4 文件的音频部分存储为 AAC 文件 我们还是一个 ViewController 来实现对一个 MP4 文件解封装、获取其中的音频编码数据并存储为 AAC 文件。...需要注意的是,我们解封装器读取的音频 AAC 编码数据存储为 AAC 文件需要条件 ADTS 头。

48030

ios 多线程你需要了解的

线程 一个进程要想执行任务,必须得有线程(每一个进程至少要有一条线程),是进程执行运算的最小单位,是进程的一个实体,是系统独立调度和分派的基本单位; 多线程 进程可以开启多条线程,每条线程可以并行...多线程原理 单核CPU同一间内能处理1条线程,多线程并发执行,其实是CPU快速地多条线程之间调度。如果CPU调度线程的时间足够快,就造成了多线程并发执行的假象。...; }); 多线程ios的运用 ?...串行队列: 创建队列,传参数DISPATCH_QUEUE_SERIAL表示创建串行队列。任务会一个一个地执行,只有前一个任务执行完成,才会继续执行下一个任务。...并发队列: 创建队列,传参数DISPATCH_QUEUE_CONCURRENT表示创建并发队列。并发队列会尽可能多地创建线程去执行任务。

35830

iOS 性能优化

在这种情况下,GPU 会预先渲染一帧放入一个缓冲区,用于视频控制器的读取。当下一帧渲染完毕后,GPU 会直接把视频控制器的指针指向第二个缓冲器。 ?...单次 RunLoop 如果时长超过 16ms,就会导致 UI 体验的卡顿。 腾讯开源性能监测工具 3.FPS监控 要保持流畅的UI交互,App 刷新率应该当努力保持 60fps。...对此你应用,应该尽量减少不必要的属性修改。 当视图层次调整,UIView、CALayer 之间会出现很多方法调用与通知,所以优化性能,应该尽量避免调整视图层次、添加和移除视图。...图片设置到 UIImageView 或者 CALayer.contents 中去,并且 CALayer 提交到 GPU 前,CGImage 的数据才会得到解码。...如果想要绕开这个机制,常见的做法是在后台线程先把图片绘制到 CGBitmapContext ,然后 Bitmap 直接创建图片。目前常见的网络图片库都自带这个功能。

2.8K20

iOS开发权限再度梳理

前言 上篇文章iOS开发的这些权限,你搞懂了吗?介绍了一些常用权限的获取和请求方法,知道这些方法的使用基本上可以搞定大部分应用的权限访问的需求。...Media Siri 导入头文件@import Intents;; 与其他权限不同的,使用Siri需要在XcodeCapabilities打开Siri开关,Xcode会自动生成一个xx.entitlements...Xcode 8的info.plist需要设置以下两种权限: 1、Privacy - Health Update Usage Description 2、Privacy - Health Share...,并且可以根据不同的状态进行相应的修改UI或者数据访问的操作。...,这些权限使用时注意回调方法的权限处理; HomeKit、HealthKit、Siri需要开启Capabilities的开关,即生成projectName.entitlements文件; 开源库

67740
领券