10

में वीडियो बजाना मैंने लाइव स्ट्रीमिंग video/audio लाइव स्ट्रीमिंग के बारे में यहां कई पोस्ट पढ़ी हैं। दुर्भाग्यवश ऐसा लगता है कि कोई भी "अच्छा" समाधान नहीं है।UITableView

मुझे वीडियो के लिए समान कार्यक्षमता चाहिए जो छवियों के लिए SDWebImageView प्रदान की गई है।

अभी, मैं निम्नलिखित कोड का उपयोग कर रहा: -

NSURL *url=[[NSURL alloc] initWithString:@"http://www.ebookfrenzy.com/ios_book/movie/movie.mov"]; 
MPMoviePlayerController *moviePlayer=[[MPMoviePlayerController alloc] initWithContentURL:url]; 
moviePlayer.controlStyle=MPMovieControlStyleDefault; 
moviePlayer.shouldAutoplay=YES; 

लेकिन जब मैं tableview, सभी वीडियो फिर से और फिरडाउनलोड स्क्रॉल किया। तो कैसे मैं डाउनलोड करना बंद कर सकता हूं?

क्या UITableView में वीडियो चलाने के लिए कोई बेहतर समाधान है? फेसबुक, इंस्टाग्राम, और वाइन ऐप्स कर रहे हैं?

+3

MPMoviePlayerController और MPMoviePlayerViewController आईओएस 9 के बाद के बाद से पदावनत कर रहे हैं। आपको कुछ अन्य प्लेयर नियंत्रक का उपयोग करना चाहिए। https://developer.apple.com/library/ios/documentation/MediaPlayer/Reference/MPMoviePlayerController_Class/ और https://developer.apple.com/library/ios/documentation/MediaPlayer/Reference/MPMoviePlayerViewController_class/index.html देखें # // apple_ref/occ/cl/MPMoviePlayerViewController – Skywalker

+0

ठीक है। तब मैं AVPlayerViewController का उपयोग करूँगा। लेकिन मेरी समस्या यह है कि मैं उस वीडियो को टेबलव्यू के कारण बार-बार डाउनलोड कर कैसे रोक सकता हूं .. –

+1

मुझे लगता है कि यह उत्तर मदद करेगा ..http: //stackoverflow.com/a/14961854/5316422 – Skywalker

उत्तर

7

जब आप तालिका दृश्य को स्क्रॉल करते हैं तो विधि -tableView:cellForRowAtIndexPath: निकाल दी जाती है (वास्तव में जब हर बार सेल को इस विधि को देखा जाएगा)। मेरा मानना ​​है कि आप इस विधि में अपने मीडियाप्लेयर को आवंटित और प्रारंभ कर रहे हैं और इसीलिए वीडियो फिर से डाउनलोड किया गया है। आप सरणी जोड़ने और पहले से बनाए गए सेल को स्टोर करने का प्रयास कर सकते हैं (किसी प्रकार का कैश)। फिर आपके -tableView:cellForRowAtIndexPath को यह जांचना चाहिए कि क्या वास्तविक सूचकांक के लिए इसे कैश किया गया है या नहीं। यदि हां तो कैश्ड सेल दिखाएं। यदि नहीं, तो उसे सेल, आवंटन, और init प्लेयर बनाना चाहिए और फिर कैश में सेल स्टोर करना चाहिए।

मेरे ViewController संपत्ति है: NSMutableDictionary *cache; और ViewDidLoad में मेरे पास है: cache = [[NSMutableDictionary alloc] init]; मेरे -tableView:cellForRowAtIndexPath: इस तरह दिखता है:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *cellId = @"myCellId"; 

    MyTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId]; 

    if ([cache objectForKey:[NSString stringWithFormat:@"key%lu", indexPath.row]] != nil) { 
     cell = [cache objectForKey:[NSString stringWithFormat:@"key%lu", indexPath.row]]; 
    } else { 
     NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"MyTableViewCell" owner:self options:nil]; 
     cell = [nib objectAtIndex:0]; 

     AVPlayerViewController *playerViewController = [[AVPlayerViewController alloc] init]; 
     playerViewController.player = [AVPlayer playerWithURL:[[NSURL alloc] initWithString:@"http://www.ebookfrenzy.com/ios_book/movie/movie.mov"]]; 
     [cell addSubview:playerViewController.view]; 
     [cache setValue:cell forKey:[NSString stringWithFormat:@"key%lu", indexPath.row]]; 
    } 

    return cell; 
} 

यह मेरे लिए काम करता है। बेशक आपको अपने डेटासेट इत्यादि का उपयोग करने की आवश्यकता है

+1

मैंने पहले ही यह कोशिश की है। लेकिन मैं काम नहीं कर रहा हूं .. यदि आपके पास इसके लिए नमूना कोड है, तो कृपया प्रदान करें। मेरे लिए यह बेहतर है .. प्रश्न के तहत @Meharoof Najeeb की टिप्पणी देखें .. –

+0

@MeetDoshi मैंने नमूना कोड विज्ञापन जोड़ा है जिसे आपने – owocki

+0

धन्यवाद दिया !! !! यह अच्छा लगता है। ईमानदारी से यह एक महान तर्क है। –

9

MPMoviePlayerController का उपयोग न करें, AVFoundation के AVPlayer का उपयोग करें।

इसके अतिरिक्त, अपने UITableViewCell सबक्लास पर अपनी संपत्ति को डाउनलोड करने के जोड़े को जोड़े मत दो। वीडियो संपत्तियों को डाउनलोड और प्रबंधित करने के लिए एक अतिरिक्त डेटा स्रोत का उपयोग करें।

कुछ तरीके हैं जो आप कर सकते हैं।

  1. AVPlayerItem वस्तुओं यूआरएल द्वारा प्रारंभ की कोई डेटा स्रोत सरणी रखें। प्रत्येक बार जब आप किसी सेल पर स्क्रॉल करते हैं, तो संपत्ति को लोड करने के बजाय, सेल के प्लेयर में AVPlayerItem लोड करें, और जब आप स्क्रॉल करते हैं तो इसे हटा दें।

  2. यदि आपको वीडियो डेटा जारी रखने की आवश्यकता है, तो प्रत्येक वीडियो को अपनी दस्तावेज़ निर्देशिका में एक अस्थायी फ़ाइल में डाउनलोड करने पर विचार करें। जब फ़ाइल डाउनलोडिंग समाप्त हो जाती है, तो उस डेटा को AVAsset में initWithURL: विधि का उपयोग करके लोड करें और यूआरएल को अपनी स्थानीय फाइल पर इंगित करें। तैयार होने पर, आप initWithAsset: का उपयोग करके AVPlayerItem में अपनी संपत्ति लोड कर सकते हैं और वीडियो चला सकते हैं।

+0

मैं वीडियो को रोकना चाहता हूं, जब उपयोगकर्ता नीचे स्क्रॉल करता है और इसे फिर से चलाता है, तो यह बिंदु संख्या 1 –

+0

द्वारा किया जा सकता है क्या आप वीडियो डाउनलोड करने के लिए एक कोड प्रदान कर सकते हैं । –

+0

क्या कोई थर्डपार्टी फ़्रेमवर्क है जिसके द्वारा मैं कोशिकाओं में वीडियो चला सकता हूं। –

2

स्विफ्ट 3

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell : UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "Cell")! 
    let videoURL = NSURL(string: "http://www.ebookfrenzy.com/ios_book/movie/movie.mov") 
    let player = AVPlayer(url: videoURL! as URL) 
    let playerLayer = AVPlayerLayer(player: player) 
    playerLayer.frame = cell.bounds 
    cell.layer.addSublayer(playerLayer) 
    player.play() 
    return cell 
}