今天给大家分享下视频的解码,解码器分为硬解码(videotoolbox)和软解码(ffmpeg)实现。
硬解码由于耗用CPU极低,解码效率高所以优先选择,软解码占用CPU高,只在8.0以下使用,推荐720P以下分辨率,当然也有优点,6.x、7.x系统都可用。
首先是解码器的设计图:
和上一篇文章中的编码器一样,H264Decoder作为基类首先是创建解码器接口,当8.0以上系统 选择硬解码 其他软解码
+ (id)create
{
if (Version_iOS_8) {
H264VideoToolboxDecoder *decoder = [[H264VideoToolboxDecoder alloc] init];
return decoder;
}
else
{
H264Decoderlmpl *decoder = [[H264Decoderlmpl alloc] init];
return decoder;
}
}
构造的时候和编码器又有区别,在解码的时候创建了自己独立的线程,在dealloc的时候在去停止线程
- (void)startThread
{
_signal = [[NSCondition alloc] init];
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(Threadfunc) object:nil];
_thread = thread;
[_thread setName:@"videoDecoderThread"];
[_thread start];
}
- (void)stopThread
{
[_signal lock];
[_signal signal];
[_signal unlock];
_signal =nil;
if (_thread)
[_thread cancel];
_thread = nil;
return 0;
}
当从网络收到视频数据时,调用decoder的decode方法,将数据放到解码队列中并通过信号通知解码线程,这里也做了一些处理例如第一个关键帧前面的数据全部丢弃,当收到关键帧时发现解码队列还有数据那么直接清空队列,解码最新的数据。