当前位置:  编程技术>移动开发
本页文章导读:
    ▪再看Core Data中PSC陷入死锁的有关问题        再看Core Data中PSC陷入死锁的问题在《Core Data Programming Guide》文档的Concurrency with Core Data这一章节中提到了“Use Thread Confinement to Support Concurrency”,这里的“Thread”还包含serial operation queue和dispa.........
    ▪ P型硅与N型硅的差异        P型硅与N型硅的区别前段时间面试一家芯片公司时,被问到了这个问题,一并整理出来,免得自己又忘记了,在面试的过程中,只要能画出价电子的图,说个大概,应该就可以了。 导电率在10.........
    ▪ 视频播放器原理1       视频播放器原理一一、知识点   ES流(Elementary Stream): 也叫基本码流,包含视频、音频或数据的连续码流. PES流(Packet Elementary Stream): 也叫打包的基本码流, 是将基本的码流ES流根据需要分成长 度.........

[1]再看Core Data中PSC陷入死锁的有关问题
    来源: 互联网  发布时间: 2014-02-18
再看Core Data中PSC陷入死锁的问题

在《Core Data Programming Guide》文档的Concurrency with Core Data这一章节中提到了“Use Thread Confinement to Support Concurrency”,这里的“Thread”还包含serial operation queue和dispatch queue。

我目前的理解是MOC会负责对PSC进行加锁解锁,这些动作需要保证有序地得到执行,如果两个thread同时访问一份context,尤其是其中一个进行写操作,另一个进行读操作,就很容易发生死锁:

- (void)runSave
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
        NSManagedObjectContext *moc = appDelegate.managedObjectContext;
        
        if (moc) {
            for (int j = 0; j < 10000; ++j) {
                
                NSString *threadPtr = [NSString stringWithFormat:@"%p", [NSThread currentThread]];
                [_threadDict setObject:@"Running Thread" forKey:threadPtr];
                
                People *people = [NSEntityDescription insertNewObjectForEntityForName:@"People" inManagedObjectContext:moc];
                people.name = @"noname";
            }
            
            NSLog(@"**********IN SAVE %@", [NSThread currentThread]);
            NSError *error = nil;
            if ([moc save:&error]) {
                ;
            }

            NSLog(@"**********OUT SAVE %@", [NSThread currentThread]);
        }
    });
}

- (void)runFetch
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
        AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
        NSManagedObjectContext *moc = appDelegate.managedObjectContext;
        
        if (moc) {
            NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
            [fetchRequest setEntity:[NSEntityDescription entityForName:@"People" inManagedObjectContext:moc]];
            
            NSLog(@"~~~~~~~~~~IN FETCH %@", [NSThread currentThread]);
            NSError *error = NULL;
            NSArray *array = [moc executeFetchRequest:fetchRequest error:&error];
            if (array) {
                ;
            }
            NSLog(@"~~~~~~~~~~OUT FETCH %@", [NSThread currentThread]);
        }
    });
}

死锁的表现为:



    
[2] P型硅与N型硅的差异
    来源: 互联网  发布时间: 2014-02-18
P型硅与N型硅的区别

前段时间面试一家芯片公司时,被问到了这个问题,一并整理出来,免得自己又忘记了,在面试的过程中,只要能画出价电子的图,说个大概,应该就可以了。

导电率在10*e-7 ~ 10*e3 之间的材料都称为半导体,有一些半导体是纯元素,如硅,锗,这构成了半导体的基础。OK,先来张图,看看硅的电子分布。


纯净的硅更像是绝缘体,而不是导体,当它被施加外部作用时(比如外加电压),没有能力改变其导电状态。所以必须往硅里面掺杂其它的元素,现在最重要的两个元素是----硼B和磷P。
当硅片被掺入硼或磷时,它的导电性就显著的改变了。通常情况下,一个纯硅片中是没有自由电子的,它所有的四个价电子都被锁住在与相邻硅原子的共价键中(如下图),由于没有自由电子,外加电压几乎无法导致电子流过硅片。

把磷加入到硅晶片中后,情况将发生改变。与硅不同,磷有五个价电子,而不是四个。其中,四个价电子和相邻的硅原子的四个价电子形成共价键。但第五个价电子没有电子结合,将飘浮在原子周围。如果一个电压施加到硅-磷混合物,这个未被束缚电子将穿过掺杂的硅片向电压的正极移动,向混合特中掺杂的磷越多,产生的电流越大。掺入磷杂质的硅称为“N型硅”,或“负电荷载流子型硅”。
一个磷原子加入到硅晶片中提供了一个未被束缚的电子,增加了电导率。加入了磷元素的硅称为N型硅。

如果往一片纯硅中,加入硼,则是另外一种情况,因为硼只有三个价电子,当它和硅混合在一起的时候,所有的三个价电子将和相邻的硅原子结合。这时,在一个硼原子和硅原子形成的共价键中,就会形成一个“空穴”。如果施加电压,相邻的一个电子过来填充这个空位,这个“空穴”便会朝向电压负极移动。这些空穴被称为正电荷载流子,尽管它们本质上不含有实际的电荷。然而,由于硅原子接受了空穴,原子核中的质子与外部轨道中的电子之间存在着电荷不平衡,所以看起来好像是每个空穴都有一个正电荷。含有一个空穴的特殊硅原子的净电荷呈正极性,其电荷量等于一个质子的电荷量(或一个电子电荷量的负值)。被掺入硼的硅被称为“P型硅”或“正电荷载流子型硅”。
当硼原子加入到硅晶片中,形成了一个空穴。这个空穴就像一个正电荷,它增加了电导率。加入了硼元素的硅称为P型硅。


基本上,面试的时候,如果被问到这个问题,能把这两个图画出来,基本上就没什么问题了,图画出来了,基本上,就很清楚理解了这两种半导体的构成方式,至于一些特性,基本上不属于面试的时候要考的,要考的应该是对这两个的理解吧。



    
[3] 视频播放器原理1
    来源: 互联网  发布时间: 2014-02-18
视频播放器原理一

一、知识点
 

ES流(Elementary Stream): 也叫基本码流,包含视频、音频或数据的连续码流.

PES流(Packet Elementary Stream): 也叫打包的基本码流, 是将基本的码流ES流根据需要分成长
度不等的数据包, 并加上包头就形成了打包的基本码流PES流.

TS流(Transport Stream): 也叫传输流, 是由固定长度为188字节的包组成, 含有独立时基的一个或
多个program, 一个program又可以包含多个视频、音频、和文字信息的ES流; 每个ES流会有不同的
PID标示. 而又为了可以分析这些ES流, TS有一些固定的PID用来间隔发送program和ES流信息的表格: PAT和PMT表.

(在MPEG-2系统中,由视频, 音频的ES流和辅助数据复接生成的用于实际传输的标准信息流称为MPEG-2传送流)

封装 : 就是捆绑打包, 将画面视频文件和音轨文件打包在一起, 并按照一定规则建立排序和索引, 便
于播放器或播放软件来索引播放. 包括AVI \ PS(Program Stream)\ TS(Transport Stream)\ MKV(Matroska)等.

二、播放过程回放
 

Figure 1. 视频播放基本处理流程

 

①access 访问: 无需多说, 可理解为接收、获取、得到数据流

②demux 解复用: 把合在一起的音频和视频分离(还有可能的字幕)  

③decode 解码: 包括音频和视频的解码

④output 输出: 也分为音频和视频的输出(aout 和 vout)

这里需要着重说明的是: demux 和 decode 部分

demux部分
我们都知道, 音视频在制作的时候实际上是独立编码的, 得到的是分开的数据, 为了传输方便必须要用某种
方式合起来, 这就有了各种封装格式. 例如, rm \ avi \ mov \ mpg 等等. 同时, 在视频播放器上demux解
复用部分也就有了他存在意义 .

他首先解析TS流的信息, 之后把分解出来的音频和视频流分别送往音频解码器和视频解码器, 进行解码操作.

decode部分
影像在录制后, 原始的音视频都是占用大量空间, 而且是冗余度较高的数据. 因此, 通常会在制作的时候就会进
行某种压缩 ( 压缩技术就是将数据中的冗余信息去除数据之间的相关性 ). 这就是我们熟知的音视频编码格式,
 包括MPEG1(VCD)\ MPEG2(DVD)\ MPEG4 \ H.264 等等. 音视频解码器的作用就是把这些压缩了的数据还原
成原始的音视频数据. 当然, 编码解码过程基本上都是有损的 .

那播放器是如何实现视频一帧一帧的播放的呢?

一般在内存中将压缩的视频帧依次解码出来(当然不可能把一个视频文件的所有压缩数据一次性装到内存中去,
而是读出一点, 然后解码出来一点), 然后一帧一帧送到显卡的显存中就能显示了.
如果机器性能跟得上(基本上不用考虑机器性能), 解一帧的时间小于帧与帧之间的正常间隔, 就能流畅的播放.  
每帧的播放是靠PTS来控制的, 解码器解完每幅图像, 都会给出该图像的PTS, video  renderer就能按图像的PTS
来安排显示.

与此同时, 别忘了音频和视频在demux之后是独立的,这就需要有一套机制把它们同步起来. 同时我们需要有一套机
制来控制速度、暂停、停止、跳进、 获取各种媒体信息、设置属性等等 .这些也就是同步控制机制来完成的事情
(基于时间戳来搞定) .简略来说, 就是以音频时间为主 (声卡有时间同步处理机制), 声音图象交错发送
视频解码时, 按当前播放时间找到对应的视频帧 (可以假设一个音频包有N个图象, 就在这一个音频包完成的过
程中按帧率显示图象)

 

视频编解码器 : http://zh.wikipedia.org/zh-cn/%E8%A7%86%E9%A2%91%E7%BC%96%E8%A7%A3%E7%A0%81%E5%99%A8
视频文件格式 : http://zh.wikipedia.org/zh-cn/%E8%A7%86%E9%A2%91%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F
参考 : http://bbs.chinavideo.org/viewthread.php?tid=1183&extra=page%3D1

A Simple Media Player based on the FFmpeg libraries — ffplay

ffplay.c – File Reference : http://cekirdek.pardus.org.tr/~ismail/ffmpeg-docs/ffplay_8c.html

ffplay.c : http://cekirdek.pardus.org.tr/~ismail/ffmpeg-dssocs/ffplay_8c-source.html


    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3