2015-12-03 60 views
0

目標:從內存加載電影數據,然後寫入到電影文件的Mac。從內存加載電影數據,然後寫入電影文件

要做到這一點,我發現這一點: https://developer.apple.com/legacy/library/technotes/tn1195/_index.html

我的代碼部分是:

void createMovieFromMemory(void *data, 
         Size dataSize, 
         Str255 fileName) 
{ 
    Handle myDataRef = NULL; 

    MovieImportComponent miComponent; 
    Track     targetTrack = nil; 
    TimeValue    addedDuration = 0; 
    long     outFlags = 0; 
    OSErr     err; 
    ComponentResult   result; 
    Movie     movie = NULL; 


    miComponent = OpenDefaultComponent(MovieImportType,kQTFileTypeMP4); //kQTFileTypeWave 

    //implementation of this is learned from the link given above 
    myDataRef = createPointerDataRefWithExtensions(data, /* pointer to data */ 
                dataSize, /* size of data */ 
                fileName, /* file name */ 
                0, /* file type */ 
                nil); /* mime type */ 

    if (myDataRef) 
    { 
     OSErr err = noErr; 
     short id = 0; 

     err = MovieImportDataRef(miComponent, 
           myDataRef, 
           HandleDataHandlerSubType, 
           movie, 
           nil, 
           &targetTrack, 
           nil, 
           &addedDuration, 
           movieImportCreateTrack, 
           &outFlags);   


     if (err == noErr) 
      DisposeMovie(movie); 

     DisposeHandle(myDataRef); 
    } 
} 

現在我的問題是什麼是在內存加載了影片的正確方法(用於測試目的),我應該如何安排電影數據在內存中。

目前,我使用下面的代碼加載電影記憶:

unsigned int getFileSize(FILE **file){ 
    unsigned int size; 
    if(fseek(*file, 0, SEEK_END) == -1){ return -1; } 
    size = ftell(*file); 
    fseek(*file, 0, SEEK_SET); 
    return size; 
} 

char *getFileBuffer(FILE **file, unsigned int fileSize){ 
    char *buffer = malloc(fileSize + 1); 
    fread(buffer, fileSize, 1, *file); 
    return buffer; 
} 

unsigned int readFileToMemory(char path[], char **buffer){ 
unsigned int fileSize; 

    FILE *file = fopen(path, "rb"); 
    if(file != NULL){ 
     fileSize = getFileSize(&file); 
     *buffer = getFileBuffer(&file, fileSize); 
     fclose(file); 
     return fileSize; 
    }else{ 
     *buffer = NULL; 
     return -1; 
    } 
} 

我累了它與下面的代碼:

int main(int argc, const char* argv[]) 
{ 

    void* pData = NULL; 
    Size iDataSize = 0; 
    Str255 strFileName="/Users/x/SAMPLE_convert.mp4"; 

    char path[] = "/Users/x/SAMPLE.AVI"; 
    char *buffer; 
    int fileSize; 
    fileSize = readFileToMemory(path, &buffer); 

    iDataSize = fileSize; 

    createMovieFromMemory((void*)buffer,iDataSize,strFileName); 
    return (0); 
} 

功能MovieImportDataRef()返回錯誤代碼-50。我周圍搜索無法找到錯誤代碼-50。任何建議,歡迎。謝謝。

JL

回答

0

您使用的是非常舊的傳統API。若要打開電影,請使用NewMovieFromProperties():

CFStringRef path = CFStringCreateWithCString(NULL, filename, kCFStringEncodingUTF8); 
    Boolean boolTrue = TRUE; 
    QTNewMoviePropertyElement newMovieProperties[] = 
    { 
     { kQTPropertyClass_DataLocation, kQTDataLocationPropertyID_CFStringNativePath, 
      sizeof(CFStringRef), &path, 0 }, 
     { kQTPropertyClass_NewMovieProperty, kQTNewMoviePropertyID_Active, 
      sizeof(boolTrue), &boolTrue, 0 }, 
     { kQTPropertyClass_MovieInstantiation, kQTMovieInstantiationPropertyID_AsyncOK, 
      sizeof(boolTrue), &boolTrue, 0 }, 
     { kQTPropertyClass_NewMovieProperty, kQTNewMoviePropertyID_DontInteractWithUser, 
      sizeof(boolTrue), &boolTrue, 0 }, 
     { kQTPropertyClass_MovieInstantiation, kQTMovieInstantiationPropertyID_DontAskUnresolvedDataRefs, 
      sizeof(boolTrue), &boolTrue, 0 }, 
    }; 
    Movie movie = NULL; 
    OSStatus err = NewMovieFromProperties(sizeof(newMovieProperties)/sizeof(newMovieProperties[0]), newMovieProperties, 0, NULL, &movie); 
    CFRelease(path); 
    if (err != noErr) 
     fprintf(stderr, "Failed to open movie (error %d)\n", err); 

這將從文件打開電影。您也可以通過網址打開電影。你說你想從內存中打開它「出於測試目的」,但這更復雜,因爲電影媒體數據可能會很大,而QuickTime的設計恰恰不是將它全部加載到內存中,而是隻根據需要訪問媒體的一部分。如果由於某種原因,你確實有內存中的數據,最簡單的方法可能是首先寫入文件。順便說一句,雖然你不這樣說,但你似乎暗示你想將電影從一種格式轉換爲另一種格式(例如,AVI轉換爲MP4)。 NewMovieFromProperties實際上會導入QuickTime支持的任何格式的媒體文件(包括AVI,MOV,MP4,WAV,3GP,MP3等,不一定只是電影,還包括音頻文件,靜止圖像等),並創建QuickTime電影結構在記憶中。然後,您可以將任何可用的QuickTime影片導出器組件導出爲其他格式。

-50是參數錯誤(paramErr),請參閱CarbonCore框架中的MacErrors.h。