2011-02-23 137 views
27

在應用程序中播放Youtube視頻很容易,並且周圍有很多文檔。在應用程序中將Youtube視頻保存到iPhone

有兩個問題與:

  1. 關閉YouTube播放器後,如果用戶想再次發揮它,它必須等待在線流媒體再次
  2. 不能在家裏玩離線(負載視頻觀看的道路上)

是否有人代碼:

  1. 下載YouTube視頻Documents文件夾,並顯示下載進度
  2. 播放下載的視頻從文件夾加載文件時(未連接到互聯網,這意味着即使)

回答

1

我會播放視頻,並找出正在存儲的臨時文件是在哪裏。如果您可以訪問它,請將其複製到某個文檔文件夾以供離線查看。

+0

肖恩,這是一些建議。但我在一些中文應用中看到的實現顯示自定義進度下載,並允許在下載後隨時播放,無需先播放。可以同時進行許多下載。 – Biko 2011-02-23 11:42:13

+0

在我的沙箱中(https://github.com/comonitos/youtube_video)。我從YouTube上的文檔文件夾下載視頻。爲了顯示進度,您可以使用NSURLConnection委託或ASIHTTPRequest(allseeing-i.com/ASIHTTPRequest):1-應用程序獲取YouTube網址。 2 ASIHTTPRequest || NSURLConnection - 下載並顯示進度。 – comonitos 2012-03-09 08:41:51

5

我個人不知道如何下載YouTube視頻(並且代碼太大而無法在此處作答)。

但是,這裏有一個完整的youtube下載示例here。 這是一個開源的YouTube下載程序,名爲LoadTube:here's the a link to the source code

+0

感謝您的鏈接 - 這將有所幫助! – Biko 2011-05-24 04:26:36

42

從YouTube下載視頻:

  1. 獲取URL從下載,通過YouTube API或其它任何方法。
  2. 創建一個NSOutputStreamNSFileHandle在臨時文件(位於NSTemporaryDirectory()或您的Documents目錄中的臨時名稱文件)上打開。
  3. 設置您的進度條以及您需要執行的任何操作。
  4. 分配並啓動NSURLConnection以從URL中獲取文件。當然,不要使用sendSynchronousRequest:returningResponse:error:
  5. connection:didReceiveResponse:委託方法中,讀出要下載的數據的長度以正確更新進度欄。
  6. connection:didReceiveData:委託方法中,將數據寫入輸出流/文件句柄並根據需要更新進度欄。
  7. connectionDidFinishLoading:connection:didFailWithError:中,關閉輸出流/文件句柄並根據需要重命名或刪除臨時文件。

要播放它,只需使用NSURL的fileURLWithPath:在Documents目錄中創建指向本地文件的URL並像播放任何遠程視頻一樣播放。

+0

很好的答案Anomie - 我會盡快嘗試。 – Biko 2011-05-24 04:26:16

+1

@Biko;不要好奇,但它工作? – Jake 2011-05-30 10:14:11

+0

MiRAGe從https://github.com/iosdeveloper/MyTube得到清理代碼 - 決定看看那裏使用的機制是否健壯。之後我會檢查Anomie解決方案。 – Biko 2011-06-01 04:09:06

6

這是我的例子:https://github.com/comonitos/youtube_video

我用PSYouTubeExtractor.h類由彼得·斯坦伯格它可以讓YouTube的MP4視頻網址,比下載和觀看的是不是一個問題

NSURLConnection的 + NSNotificationCenter + PSYouTubeExtractor + NSMutableData

7

香港專業教育學院使用的類從這個項目:https://github.com/larcus94/LBYouTubeView 它適合我。 我可以下載youtube視頻。

我用這個代碼:

LBYouTubeExtractor *extractor = [[[LBYouTubeExtractor alloc] initWithURL:[NSURL URLWithString:[NSString stringWithFormat:(@"http://www.youtube.com/watch?v=%@"), self.videoID ]] quality:LBYouTubeVideoQualityLarge] autorelease]; 
[extractor extractVideoURLWithCompletionBlock:^(NSURL *videoURL, NSError *error) { 
    if(!error) { 
     NSLog(@"Did extract video URL using completion block: %@", videoURL); 

     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
      NSData *data = [NSData dataWithContentsOfURL: videoURL]; 
      NSString *pathToDocs = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
      NSString *filename = [NSString stringWithFormat:(@"video_%@.mp4"), self.videoID ]; 
      [data writeToFile:[pathTODocs stringByAppendingPathComponent:filename] atomically:YES]; 
      NSLog(@"File %@ successfully saved", filename); 
     }); 
    } else { 
     NSLog(@"Failed extracting video URL using block due to error:%@", error); 
    } 
}]; 

您可以顯示使用以上職位描述的技術下載的進度。

+1

完美解決方案 – 2013-08-05 08:35:18

+0

完美! – Trident 2015-04-24 19:59:44

+0

@Petr,現在不適合我。你能告訴我這是現在的工作嗎? – 2015-07-22 09:35:35

相關問題