1. 程式人生 > >iOS iTunes匯入本地視訊(檔案共享)

iOS iTunes匯入本地視訊(檔案共享)

完成效果:

用iTunes向app匯入視訊後,不用手動重新整理,編寫的工具類會實時監聽複製狀態,複製完成後會自動重新整理UI.

大坑:因為檔案共享是共享的Document資料夾下所有資源,所以你需要把非共享的檔案,如:資料庫檔案、快取檔案等,存放到除Document資料夾以外的地方,如:Preferences或Caches資料夾下,否則app會被拒!!!

1.在Info.plist新增欄位:

“Application supports iTunes file sharing” 值設定為“YES”;
新增之後手機連線iTunes才能在檔案共享中找到自己的應用

WechatIMG1.jpeg

2.單例工具類FileWatcher
的啟動與登出

啟動內容包括:
* 獲取app中已經用iTunes匯入的視訊
* 開啟對Document資料夾的監聽
* 相關屬性的初始化

@interface FileWatcher ()
@property (nonatomic, strong)  dispatch_source_t source;
@property (nonatomic, strong) NSMutableArray *videoNameArr;
@property (nonatomic, assign) BOOL isConvenientFinished; //一次遍歷完成標識
@property (nonatomic
, assign) BOOL isFinishedCopy; //複製完成標識 @end
- (void)startManager {
    self.dataSource = [[NSMutableArray alloc] init];
    self.videoNameArr = [[NSMutableArray alloc] init];
    self.isFinishedCopy = YES;  
    self.isConvenientFinished = YES;
    [self getiTunesVideo];
    [self startMonitorFile];
}

- (void
)stopManager { dispatch_cancel(self.source); }

3.Document資料夾監聽方法

- (void)startMonitorFile {  //監聽Document資料夾的變化

    NSURL *directoryURL = [NSURL URLWithString:[SandBoxHelper docPath]]; //新增需要監聽的目錄    
    int const fd =
    open([[directoryURL path] fileSystemRepresentation], O_EVTONLY);
    if (fd < 0) {     
        NSLog(@"Unable to open the path = %@", [directoryURL path]);
        return;
    }    
    dispatch_source_t source =
    dispatch_source_create(DISPATCH_SOURCE_TYPE_VNODE, fd,
                           DISPATCH_VNODE_WRITE,
                           DISPATCH_TARGET_QUEUE_DEFAULT);
    dispatch_source_set_event_handler(source, ^() {
        unsigned long const type = dispatch_source_get_data(source);
        switch (type) {
            case DISPATCH_VNODE_WRITE: {
                NSLog(@"Document目錄內容發生變化!!!");
                if (self.isConvenientFinished) {
                    self.isConvenientFinished = NO;
                    [self directoryDidChange];
                }
                break;
            }
            default:
                break;
        }
    });

    dispatch_source_set_cancel_handler(source, ^{
        close(fd);        
    });    
    self.source = source;
    dispatch_resume(self.source);
}

4.將iTunes匯入的視訊顯示出來的核心方法

- (void)directoryDidChange {
    [self getiTunesVideo];
}

- (void)getiTunesVideo {    
    dispatch_async(fileWatcher_queue(), ^{
        //獲取沙盒裡所有檔案
        NSFileManager *fileManager = [NSFileManager defaultManager];
        //在這裡獲取應用程式Documents資料夾裡的檔案及資料夾列表
        NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentDir = [documentPaths objectAtIndex:0];
        NSError *error = nil;
        NSArray *fileList = [[NSArray alloc] init];
        //fileList便是包含有該資料夾下所有檔案的檔名及資料夾名的陣列
        fileList = [fileManager contentsOfDirectoryAtPath:documentDir error:&error];
        if (fileList.count > 0) {
            for (NSString *file in fileList) {
                //在這裡新增資源的過濾條件
                if ([file hasSuffix:@".mov"] ||[file hasSuffix:@".mp4"] || [file hasSuffix:@".m4v"]) {
                    NSString *videoPath = [documentDir stringByAppendingPathComponent:file];
                    NSArray *lyricArr = [videoPath componentsSeparatedByString:@"/"];
                   //此判斷的作用:避免同一資源的反覆新增,使資源只新增過一次後,只要不刪,就不會再重新獲取路徑、圖片等
                    if (![self.videoNameArr containsObject:[lyricArr lastObject]]) {
                        [self.videoNameArr addObject:[lyricArr lastObject]];
                        //===============================迴圈判斷是否複製完成==============================================
                        NSInteger lastSize = 0;
                        NSDictionary *fileAttrs = [[NSFileManager defaultManager] attributesOfItemAtPath:videoPath error:nil];
                        NSInteger fileSize = [[fileAttrs objectForKey:NSFileSize] intValue];
                        do {
                            lastSize = fileSize;
                            [NSThread sleepForTimeInterval:0.5];
                            self.isFinishedCopy = NO;
                            fileAttrs = [[NSFileManager defaultManager] attributesOfItemAtPath:videoPath error:nil];
                            fileSize = [[fileAttrs objectForKey:NSFileSize] intValue];
                            NSLog(@"%@檔案正在複製", [lyricArr lastObject]);
                        } while (lastSize != fileSize);
                        self.isFinishedCopy = YES;
                        NSLog(@"%@檔案複製完成", [lyricArr lastObject]);
                        VideoModel *model = [[VideoModel alloc] init];
                        model.videoPath = videoPath;
                        model.videoName = [lyricArr lastObject];
                        model.videoSize = [SandBoxHelper fileSizeForPath:videoPath];
                        model.videoImgPath = [self saveImg:[UIImage getThumbnailImage:videoPath] withVideoMid:[NSString stringWithFormat:@"%lld", model.videoSize]];
                        model.videoAsset = nil;
                        [self.dataSource addObject:model];
                        ///為防止一次同時拖入多個文件,使得資料載入不全,特做一次遞迴處理。
                        [self directoryDidChange];
                    }
                    [[NSNotificationCenter defaultCenter] postNotificationName:RefreshiTunesUINotification object:nil];
                }
            }
        }
        self.isConvenientFinished = YES;
    });
}

4.1.拿到匯入視訊的縮圖,並存到本地

+(UIImage *)getThumbnailImage:(NSString *)videoURL {    
    if (videoURL) {
        AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:[NSURL fileURLWithPath:videoURL] options:nil];       
        AVAssetImageGenerator *gen = [[AVAssetImageGenerator alloc] initWithAsset:asset];        
        // 設定縮圖的方向
        // 如果不設定,可能會在視訊旋轉90/180/270°時,獲取到的縮圖是被旋轉過的,而不是正向的
        gen.appliesPreferredTrackTransform = YES;    
        // 設定圖片的最大size(解析度)
        gen.maximumSize = CGSizeMake(300, 169);       
        CMTime time = CMTimeMakeWithSeconds(5.0, 600); //一秒鐘600幀,取第10幀。
        NSError *error = nil;
        CMTime actualTime; 
        CGImageRef image = [gen copyCGImageAtTime:time actualTime:&actualTime error:&error];    
        if (error) {
            UIImage *placeHoldImg = [UIImage imageNamed:@"posters_default_horizontal"];
            return placeHoldImg;
        }  
        UIImage *thumb = [[UIImage alloc] initWithCGImage:image];  
        CGImageRelease(image);   
        return thumb;      
    } else { 
         UIImage *placeHoldImg = [UIImage imageNamed:@"posters_default_horizontal"];
        return placeHoldImg;
    }
}
- (NSString *)saveImg:(UIImage *)image withVideoMid:(NSString *)videoMid{  
    if (!image) {
        image = [UIImage imageNamed:@"posters_default_horizontal"];
    }
    if (!videoMid) {
        videoMid = [NSString uuid];
    }
    //png格式
    NSData *imagedata=UIImagePNGRepresentation(image); 
    NSString *savedImagePath = [[SandBoxHelper iTunesVideoImagePath] stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.png", videoMid]];
    [imagedata writeToFile:savedImagePath atomically:YES];  
    return savedImagePath;    
}

5.刪除檔案

- (void)deleteiTunesVideo:(NSArray *)array {
    for (VideoModel *item in array) {
        [self.dataSource removeObject:item];
        [SandBoxHelper deleteFile:item.videoPath];
        [SandBoxHelper deleteFile:item.videoImgPath];
        [self.videoNameArr removeObject:item.videoName];
    }
}

以上為檔案共享的開發步驟,關於如何使用封裝好的工具類,請參考程式碼

相關推薦

iOS iTunes匯入本地視訊檔案共享

完成效果: 用iTunes向app匯入視訊後,不用手動重新整理,編寫的工具類會實時監聽複製狀態,複製完成後會自動重新整理UI. 大坑:因為檔案共享是共享的Document資料夾下所有資源,所以你需要把非共享的檔案,如:資料庫檔案、快取檔案等,存放到除

利用iTunes匯入檔案到Document資料夾檔案共享

在應用程式的Info.plist檔案中新增UIFileSharingEnabled鍵,並將鍵值設定為YES。之後就可以在itunes中看到我們的程式,並可以新增檔案了。新增的檔案會在沙盒的Document資料夾下,在程式裡就可以操作這些檔案了。

iOS 不能播放遠端視訊Android 可以的問題

問題描述: 1、同樣的 url,Android 能放,iOS 不能放。後臺給的 url 是這個樣子(mp4檔案格式): http://192.168.80.102:28085/schcommonweb/weedfs/rdownload/[email p

Linux、window伺服器下建立共享資料夾方便與區域網內進行檔案共享

SEO關鍵字:samba伺服器的搭建 ServU的安裝使用 玉念聿輝 Linux共享檔案 window共享檔案 深圳市奧捷迅科技 吳明輝 感謝CSDN品臺。 Linux下samba的安裝和建立共享檔案 1、關閉selinux setenforce 0 2、關閉ipta

Java學習筆記09--靜態匯入 ;增強for迴圈 ;可變引數 ;自動裝箱與自動拆箱;FILE檔案操作

∆ 靜態匯入: 靜態匯入的作用: 簡化書寫。 靜態匯入可以作用一個類的所有靜態成員。 靜態匯入的格式: import static 包名.類名.靜態的成員; 靜態匯入要注意的事項:

docker掛載本地目錄,實現檔案共享

docker可以支援把一個宿主機上的目錄掛載到映象裡。 ? 1 docker run -it -v /home/dock/Downloads:/usr/Downloads ubuntu64 /bin/bash 通過-v引數,冒號前為宿主機目錄,必須為絕對路

iOS--播放音訊、視訊1:AVAudioPlayer 2:MPMoviePlayerViewController

在iOS中有兩種方式可以播放音訊視訊。 一:AVAudioPlayer。它只能播放本地的音訊,不能網路音訊(即不能線上播放)MP3    1:首先要手動匯入音訊的框架 AVFoundation.framework。(iOS7.0以後,不用在手動匯入了,它自動已經包含了此框架

Linux 基礎知識 之 ISCSI 檔案系統 磁碟共享

一、iSCSI簡介 iscsi是一種塊級別的協議,用於通過TCP/IP網路共享原始儲存裝置,即硬碟的共享。可以用已經存在的IP和乙太網如網絡卡、交換機、路由器等通過iSCSI協議共享和訪問儲存。 iSCSI target是一種由遠端iSCSI伺服器(target)提供的遠端硬碟。 二、磁

iOS如何讓程式能夠支援檔案共享

由於iOS的沙盒機制,蘋果使用者就不能像安卓使用者那樣能夠直接往手機裡拷自己喜歡的音視訊檔案,如果你的程式支援拷貝檔案進去,並且能夠顯示在程式中。 那麼就需要以下配置了: 在應用程式的Info.plist檔案中新增UIFileSharingEnabled(Applica

IOS工具類--本地沙盒檔案基本操作

本類提供在本地檔案的讀寫、判斷等操作: /* 一:a.Documents資料夾,主要用來儲存一些重要的資訊,比如使用者資料,程式的配置檔案,聊天記錄等等 .Documents中儲存的資訊會隨著iTunes同步到電腦備份或者是iCould開發會同

NFSarm底板與PC檔案共享

    在嵌入式 Linux 開發中,需要在 Linux 主機為目標機編寫程式程式碼,然後編譯程式,生成的程式是要傳輸到目標機上才能除錯、執行。那麼如何更快、更便捷地傳輸檔案,將影響到開發工作的效率。

HTML5線上播放本地視訊IE9以上的瀏覽器

<!DOCTYPE HTML ><html><head><title>Html5視訊播放</title><meta http-equiv="keywords" content="keyword1,keyword

通訊錄檔案儲存

動態通訊錄 上篇部落格介紹了動態通訊錄,本篇繼續進一步將動態通訊錄儲存在檔案裡 載入資訊 void LoadContact(pContact pc) { FILE *pf = fopen("contact.dat.txt", "rb"); PeoInfo

MAVEN安裝jar到本地倉庫macOS版

場景:        專案需要ojdbc6的jar包,由於版權問題,maven中央倉庫已經不提供包的下載了,在倉庫檢索出來的pom均不能使用,故需手動安裝到本地倉庫。 命令:  mvn install:install-file -D

Creative Commons知識共享

Creative Commons(知識共享) Founded January 15, 2001; 17 years ago[1] Founder Lawrence Lessig Type 501(c)(3) Tax ID no. 04-3585301 Focus

python:模組檔案操作

1.模組 1.1模組的概念 模組是python程式架構的一個核心概念 每一個以副檔名 py 結尾的python原始碼檔案都是一個模組 模組名 同樣也是一個識別符號,需要符合識別符號的命名規則 在模組中定義的全域性變數,函式,類都是提供給外界直接使用的工具 模組

SAP雲解決方案和企業本地部署On-Premise混合架構下的安全認證許可權管理

SAP提供了使用者認證、許可權管理和單點登入等安全相關的解決方案。但是隨著雲平臺的興起,企業已經部署的安全解決方案如何與雲平臺的安全解決方案整合呢?這是擺在我們面前的一個問題,而且是一個至關重要、需要認真思考的問題。 本文將探討SAP提供的本地部署和雲平臺的安全解決方案產品集:SAP Single Sign

SAP雲解決方案和企業本地部署On-Premise混合架構下的安全認證權限管理

可以登錄 安全認證 風險 spa 用戶名 direct idt win 如何選擇 SAP提供了用戶認證、權限管理和單點登錄等安全相關的解決方案。但是隨著雲平臺的興起,企業已經部署的安全解決方案如何與雲平臺的安全解決方案集成呢?這是擺在我們面前的一個問題,而且是一個至關重要、

What is Creative Commons知識共享?

What is Creative Commons(知識共享)? for Teachers and Students  This information guide was jointly developed by the ARC Centre of Excellence for C

視訊一階段

各位使用者:我們的產品角弧轉換是為了解決角度計算人員的痛苦,他們需要在角度與弧度之間轉換資料。 但是現在的方案並沒有很好地解決這些需求,我們有獨特的辦法進行計算,它能給使用者帶來方便和效率,遠遠超過競爭對手。 同時,我們有高效的人際和網路推廣方法,能很快的讓大部分使用者知道我們的產品,並進一步傳播。 視