@@ -41,7 +41,8 @@ @interface FFTPlayer0x33 ()<FFTDecoderDelegate>
4141 // 音频重采样
4242 FFTAudioResample *_audioResample;
4343
44- FFTPacketQueue *_packetQueue;
44+ FFTPacketQueue *_audioPacketQueue;
45+ FFTPacketQueue *_videoPacketQueue;
4546
4647 FFTVideoFrameQueue *_videoFrameQueue;
4748 FFTAudioFrameQueue *_audioFrameQueue;
@@ -62,7 +63,8 @@ @interface FFTPlayer0x33 ()<FFTDecoderDelegate>
6263
6364// 读包线程
6465@property (nonatomic , strong ) FFTThread *readThread;
65- @property (nonatomic , strong ) FFTThread *decoderThread;
66+ @property (nonatomic , strong ) FFTThread *audioDecoderThread;
67+ @property (nonatomic , strong ) FFTThread *videoDecoderThread;
6668@property (nonatomic , strong ) FFTThread *videoThread;
6769
6870@property (atomic , assign ) int abort_request;
@@ -85,7 +87,8 @@ static int decode_interrupt_cb(void *ctx)
8587- (void )_stop
8688{
8789 self.abort_request = 1 ;
88- [_packetQueue cancel ];
90+ [_audioPacketQueue cancel ];
91+ [_videoPacketQueue cancel ];
8992 [_videoFrameQueue cancel ];
9093 [_audioFrameQueue cancel ];
9194
@@ -100,9 +103,14 @@ - (void)_stop
100103 [self .readThread join ];
101104 }
102105
103- if (self.decoderThread ) {
104- [self .decoderThread cancel ];
105- [self .decoderThread join ];
106+ if (self.audioDecoderThread ) {
107+ [self .audioDecoderThread cancel ];
108+ [self .audioDecoderThread join ];
109+ }
110+
111+ if (self.videoDecoderThread ) {
112+ [self .videoDecoderThread cancel ];
113+ [self .videoDecoderThread join ];
106114 }
107115
108116 if (self.videoThread ) {
@@ -132,13 +140,17 @@ - (void)prepareToPlay
132140 NSAssert (NO , @" 不允许重复创建" );
133141 }
134142
135- _packetQueue = [[FFTPacketQueue alloc ] init ];
143+ _audioPacketQueue = [[FFTPacketQueue alloc ] init ];
144+ _videoPacketQueue = [[FFTPacketQueue alloc ] init ];
136145
137146 self.readThread = [[FFTThread alloc ] initWithTarget: self selector: @selector (readPacketsFunc ) object: nil ];
138147 self.readThread .name = @" mr-read" ;
139148
140- self.decoderThread = [[FFTThread alloc ] initWithTarget: self selector: @selector (decoderFunc ) object: nil ];
141- self.decoderThread .name = @" mr-decoder" ;
149+ self.audioDecoderThread = [[FFTThread alloc ] initWithTarget: self selector: @selector (audioDecoderFunc ) object: nil ];
150+ self.audioDecoderThread .name = @" audio-decoder" ;
151+
152+ self.videoDecoderThread = [[FFTThread alloc ] initWithTarget: self selector: @selector (videoDecoderFunc ) object: nil ];
153+ self.videoDecoderThread .name = @" video-decoder" ;
142154
143155 self.videoThread = [[FFTThread alloc ] initWithTarget: self selector: @selector (videoThreadFunc ) object: nil ];
144156 self.videoThread .name = @" mr-v-display" ;
@@ -171,9 +183,9 @@ - (void)readPacketLoop:(AVFormatContext *)formatCtx
171183 pkt->data = NULL ;
172184 pkt->size = 0 ;
173185 pkt->stream_index = _videoDecoder.streamIdx ;
174- [_packetQueue enQueue: pkt];
186+ [_videoPacketQueue enQueue: pkt];
175187 pkt->stream_index = _audioDecoder.streamIdx ;
176- [_packetQueue enQueue: pkt];
188+ [_audioPacketQueue enQueue: pkt];
177189 break ;
178190 }
179191
@@ -192,15 +204,15 @@ - (void)readPacketLoop:(AVFormatContext *)formatCtx
192204 if (pkt->data != NULL ) {
193205 self.videoPktCount ++;
194206 }
195- [_packetQueue enQueue: pkt];
207+ [_videoPacketQueue enQueue: pkt];
196208 }
197209 break ;
198210 case AVMEDIA_TYPE_AUDIO :
199211 {
200212 if (pkt->data != NULL ) {
201213 self.audioPktCount ++;
202214 }
203- [_packetQueue enQueue: pkt];
215+ [_audioPacketQueue enQueue: pkt];
204216 }
205217 break ;
206218 default :
@@ -365,8 +377,9 @@ - (void)readPacketsFunc
365377 });
366378
367379 _formatCtx = formatCtx;
368- [self .decoderThread start ];
369- // [self.videoThread start];
380+ [self .audioDecoderThread start ];
381+ [self .videoDecoderThread start ];
382+
370383 // 循环读包
371384 [self readPacketLoop: formatCtx];
372385}
@@ -481,11 +494,24 @@ - (void)decodePkt:(AVPacket *)pkt
481494 }
482495}
483496
484- - (void )decoderFunc
497+ - (void )audioDecoderFunc
498+ {
499+ while (!self.abort_request ) {
500+ __weakSelf__
501+ [_audioPacketQueue deQueue: ^(AVPacket * pkt) {
502+ __strongSelf__
503+ if (pkt) {
504+ [self decodePkt: pkt];
505+ }
506+ }];
507+ }
508+ }
509+
510+ - (void )videoDecoderFunc
485511{
486512 while (!self.abort_request ) {
487513 __weakSelf__
488- [_packetQueue deQueue: ^(AVPacket * pkt) {
514+ [_videoPacketQueue deQueue: ^(AVPacket * pkt) {
489515 __strongSelf__
490516 if (pkt) {
491517 [self decodePkt: pkt];
@@ -494,6 +520,7 @@ - (void)decoderFunc
494520 }
495521}
496522
523+
497524#pragma mark - FFTDecoderDelegate
498525
499526- (void )decoder : (FFTDecoder *)decoder reveivedAFrame : (AVFrame *)aFrame
0 commit comments