1

비디오에서 썸네일을 가져 오려고합니다. 테이블 뷰가 셀을 재사용 할 때 비디오에서 이미지 생성을 고집하고 있습니다. 지금까지이 코드비디오에서 비디오 썸네일 가져 오기 비디오에서 새 프레임을 만들 때 시간과 테이블 뷰 스크롤이 고착됩니다.

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 


          UIActivityIndicatorView *indicatorG = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; 

          dispatch_async(dispatch_get_main_queue(), ^{ 
           [indicatorG removeFromSuperview]; 
           [indicatorG startAnimating]; 
           [indicatorG setCenter:Cell.thumbnail.center]; 
           [Cell.thumbnail addSubview:indicatorG]; 
          }); 

          AVURLAsset *asset=[[AVURLAsset alloc] initWithURL:url options:nil]; 
          AVAssetImageGenerator *generator = [[AVAssetImageGenerator alloc] initWithAsset:asset]; 
          generator.appliesPreferredTrackTransform=TRUE; 
          float getDuration = CMTimeGetSeconds(asset.duration); 
          CMTime thumbTime = CMTimeMakeWithSeconds(0,1); 

          AVAssetImageGeneratorCompletionHandler handler = ^(CMTime requestedTime, CGImageRef im, CMTime actualTime, AVAssetImageGeneratorResult result, NSError *error){ 

           if (result != AVAssetImageGeneratorSucceeded) { 

            NSLog(@"couldn't generate thumbnail, error:%@", error); 

           } 
           else{ 

            UIImageView *imgV; 

             imgV = [[UIImageView alloc] initWithImage:[UIImage imageWithCGImage:im]]; 


            dispatch_async(dispatch_get_main_queue(), ^{ 


              [indicatorG stopAnimating]; 
              Cell.thumbnail.image = imgV.image; 

            }); 
           } 
           //  [button setImage:[UIImage imageWithCGImage:im] forState:UIControlStateNormal]; 
          }; 

          CGSize maxSize = CGSizeMake(320, 180); 
          generator.maximumSize = maxSize; 
          [generator generateCGImagesAsynchronouslyForTimes:[NSArray arrayWithObject:[NSValue valueWithCMTime:thumbTime]] completionHandler:handler]; 

         }); 

하지만 파견 비동기를 사용하여 해결의 tableview 스크롤의 문제와 새로운 문제는이 코드를 방해 축소판 이미지의 순서이며, 도움이 사람을하시기 바랍니다?

편집 :

URL 코드 : 테이블 뷰를 스크롤하는 동안이 코드는 지속적으로 cellForItemAtIndexPath에서 실행되는

NSString *strUrl = [NSString stringWithFormat:@"%@",url]; 
NSURL *url = [NSURL URLWithString:strUrl]; 
+0

블록이 셀의 indexPath를 유지하게하십시오. 그렇게하면 당신의 명령이 엉망이되지 않을 것입니다. – Mercurial

+0

@ 수퍼바이저 나는 iOS를 처음 접했고 그것에 대해 자세히 설명 할 수 있습니까? – John

+0

각 테이블 행마다 URL이 다른가요? – 3stud1ant3

답변

0

경우이 좋은 구현하지 않습니다. cellForItemAtIndexPath에서 비디오로부터 이미지를 생성하라는 요청은 꽤 비쌉니다.

cellForItemAtIndexPath에서 축소판을 준비하는 대신 데이터를로드하기 전에 축소판을 준비하고 테이블보기에 저장하십시오. 또는 적어도 재사용을 위해 스크롤하는 동안 cellForItemAtIndexPath에서 한 번 처리 된 축소판을 저장할 수 있습니다. 다음 번에 cellForItemAtIndexPath에 저장된 미리보기 이미지를 사용하고 항상 셀의 이미지를 업데이트하십시오.

+0

아이디어가 멋지다. 같은 방식으로 생각했지만 문제는 인터넷 연결에 따라 생성되는 각 축소판의 생성 시간이 1 초라는 점이다. 또한 구현하려고 시도했지만 tableview에 너무 많은 비디오 게시물이 있으면 어떻게 될 것인가? 너무 많은 초 걸릴 내가 thumbnails를 구현하는 아이디어가 cellforrowatindexpath에 좋은 생각이 아니지만 여전히 우리가 백그라운드 스레드에서 축소판을 동시에 생성한다면, 그것은 엄지 손톱의 많은 숫자를 생성하는 데 단지 몇 초가 걸릴 것입니다. – John