@@ -47,7 +47,8 @@ @interface FFTPlayer0x35 ()<FFTDecoderDelegate>
4747 // 音频重采样
4848 FFTAudioResample *_audioResample;
4949
50- FFTPacketQueue *_packetQueue;
50+ FFTPacketQueue *_audioPacketQueue;
51+ FFTPacketQueue *_videoPacketQueue;
5152
5253 FFTVideoFrameQueue *_videoFrameQueue;
5354 FFTAudioFrameQueue *_audioFrameQueue;
@@ -74,7 +75,8 @@ @interface FFTPlayer0x35 ()<FFTDecoderDelegate>
7475
7576// 读包线程
7677@property (nonatomic , strong ) FFTThread *readThread;
77- @property (nonatomic , strong ) FFTThread *decoderThread;
78+ @property (nonatomic , strong ) FFTThread *audioDecoderThread;
79+ @property (nonatomic , strong ) FFTThread *videoDecoderThread;
7880@property (nonatomic , strong ) FFTThread *videoThread;
7981
8082@property (atomic , assign ) int abort_request;
@@ -97,7 +99,8 @@ static int decode_interrupt_cb(void *ctx)
9799- (void )_stop
98100{
99101 self.abort_request = 1 ;
100- [_packetQueue cancel ];
102+ [_audioPacketQueue cancel ];
103+ [_videoPacketQueue cancel ];
101104 [_videoFrameQueue cancel ];
102105 [_audioFrameQueue cancel ];
103106
@@ -112,9 +115,14 @@ - (void)_stop
112115 [self .readThread join ];
113116 }
114117
115- if (self.decoderThread ) {
116- [self .decoderThread cancel ];
117- [self .decoderThread join ];
118+ if (self.audioDecoderThread ) {
119+ [self .audioDecoderThread cancel ];
120+ [self .audioDecoderThread join ];
121+ }
122+
123+ if (self.videoDecoderThread ) {
124+ [self .videoDecoderThread cancel ];
125+ [self .videoDecoderThread join ];
118126 }
119127
120128 if (self.videoThread ) {
@@ -144,13 +152,17 @@ - (void)prepareToPlay
144152 NSAssert (NO , @" 不允许重复创建" );
145153 }
146154
147- _packetQueue = [[FFTPacketQueue alloc ] init ];
155+ _audioPacketQueue = [[FFTPacketQueue alloc ] init ];
156+ _videoPacketQueue = [[FFTPacketQueue alloc ] init ];
148157
149158 self.readThread = [[FFTThread alloc ] initWithTarget: self selector: @selector (readPacketsFunc ) object: nil ];
150159 self.readThread .name = @" mr-read" ;
151160
152- self.decoderThread = [[FFTThread alloc ] initWithTarget: self selector: @selector (decoderFunc ) object: nil ];
153- self.decoderThread .name = @" mr-decoder" ;
161+ self.audioDecoderThread = [[FFTThread alloc ] initWithTarget: self selector: @selector (audioDecoderFunc ) object: nil ];
162+ self.audioDecoderThread .name = @" audio-decoder" ;
163+
164+ self.videoDecoderThread = [[FFTThread alloc ] initWithTarget: self selector: @selector (videoDecoderFunc ) object: nil ];
165+ self.videoDecoderThread .name = @" video-decoder" ;
154166
155167 self.videoThread = [[FFTThread alloc ] initWithTarget: self selector: @selector (videoThreadFunc ) object: nil ];
156168 self.videoThread .name = @" mr-v-display" ;
@@ -183,9 +195,9 @@ - (void)readPacketLoop:(AVFormatContext *)formatCtx
183195 pkt->data = NULL ;
184196 pkt->size = 0 ;
185197 pkt->stream_index = _videoDecoder.streamIdx ;
186- [_packetQueue enQueue: pkt];
198+ [_videoPacketQueue enQueue: pkt];
187199 pkt->stream_index = _audioDecoder.streamIdx ;
188- [_packetQueue enQueue: pkt];
200+ [_audioPacketQueue enQueue: pkt];
189201 break ;
190202 }
191203
@@ -204,15 +216,15 @@ - (void)readPacketLoop:(AVFormatContext *)formatCtx
204216 if (pkt->data != NULL ) {
205217 self.videoPktCount ++;
206218 }
207- [_packetQueue enQueue: pkt];
219+ [_videoPacketQueue enQueue: pkt];
208220 }
209221 break ;
210222 case AVMEDIA_TYPE_AUDIO:
211223 {
212224 if (pkt->data != NULL ) {
213225 self.audioPktCount ++;
214226 }
215- [_packetQueue enQueue: pkt];
227+ [_audioPacketQueue enQueue: pkt];
216228 }
217229 break ;
218230 default :
@@ -383,8 +395,9 @@ - (void)readPacketsFunc
383395 });
384396
385397 _formatCtx = formatCtx;
386- [self .decoderThread start ];
387- // [self.videoThread start];
398+ [self .audioDecoderThread start ];
399+ [self .videoDecoderThread start ];
400+
388401 // 循环读包
389402 [self readPacketLoop: formatCtx];
390403}
@@ -467,7 +480,6 @@ - (FFTAudioResample *)createAudioResampleIfNeed
467480
468481#pragma mark - 解码
469482
470-
471483- (FFTDecoder *)openStreamComponent : (AVFormatContext *)ic streamIdx : (int )idx
472484{
473485 FFTDecoder *decoder = [FFTDecoder new ];
@@ -500,11 +512,11 @@ - (void)decodePkt:(AVPacket *)pkt
500512 }
501513}
502514
503- - (void )decoderFunc
515+ - (void )audioDecoderFunc
504516{
505517 while (!self.abort_request ) {
506518 __weakSelf__
507- [_packetQueue deQueue: ^(AVPacket * pkt) {
519+ [_audioPacketQueue deQueue: ^(AVPacket * pkt) {
508520 __strongSelf__
509521 if (pkt) {
510522 [self decodePkt: pkt];
@@ -513,6 +525,20 @@ - (void)decoderFunc
513525 }
514526}
515527
528+ - (void )videoDecoderFunc
529+ {
530+ while (!self.abort_request ) {
531+ __weakSelf__
532+ [_videoPacketQueue deQueue: ^(AVPacket * pkt) {
533+ __strongSelf__
534+ if (pkt) {
535+ [self decodePkt: pkt];
536+ }
537+ }];
538+ }
539+ }
540+
541+
516542#pragma mark - FFTDecoderDelegate
517543
518544- (void )decoder : (FFTDecoder *)decoder reveivedAFrame : (AVFrame *)aFrame
@@ -759,7 +785,6 @@ - (void)enQueueAudioFrame:(AVFrame *)frame
759785{
760786 const char *fmt_str = av_sample_fmt_to_string (frame->format );
761787 self.audioSamplelInfo = [NSString stringWithFormat: @" (%s )%d " ,fmt_str,frame->sample_rate];
762-
763788 [_audioFrameQueue enQueue: frame];
764789}
765790
@@ -819,10 +844,10 @@ - (NSString *)audioRenderName
819844 return [_audioRender name ];
820845}
821846
822- - (UIView *)videoRender
847+ - (UIView<IJKVideoRenderingProtocol> *)videoRender
823848{
824849 if (!_videoRender) {
825- id videoRender = [[IJKMetalView alloc ] init ];
850+ IJKMetalView * videoRender = [[IJKMetalView alloc ] init ];
826851 _videoRender = videoRender;
827852 }
828853 return _videoRender;
0 commit comments