iOS版视频的自动编码(以及参考电影的创建)



我的iPad应用程序让用户能够观看几百个视频。目前,iPad应用程序将它们指向一个MP4文件。但是,我想将它们指向QuickTime参考电影。(如果用户通过3G与wifi连接,这允许应用程序发送较低比特率版本的视频。)

现在,我通过转到文件->导出到Web,在QuickTime中创建各种版本以及引用文件。然而,这个过程(1)一次只允许我做一个文件,(2)生成很多无用的东西,比如HTML和JavaScript。

如何使流程自动化?有人知道做这项工作的现有脚本/工具吗?我相信其他开发者以前也不得不这么做。

我写了这个AppleScript(并从网上的其他东西拼凑而成)来完成这项工作:

--property exportFolder : (path to documents folder as Unicode text) & "Your Folder:"
property QTExportPath : (path to movies folder from user domain)
property completedFolderName : "completion" -- this folder must already exist
property referenceFiles : {}
property encodeCount : 0
on run
    choose folder with prompt "Choose folder with video files:" -- with multiple selections allowed
    open (result)
end run
on open droppedItems
    tell application "Finder"
        set allFiles to every file of entire contents of droppedItems as alias list
    end tell
    -- Error checking
    repeat with testFile in allFiles
        set myChars to characters of basename(testFile)
        if count_matches(myChars, ".") > 1 then
            display dialog "ERROR: The file " & basename(testFile) & " has too many periods."
            return
        end if
    end repeat
    -- Made it past error checking, let's get started
    tell application "QuickTime Player"
        activate
        close every window
    end tell
    repeat with thisItem in allFiles
        tell application "QuickTime Player"
            close every window
            open thisItem as alias
        end tell
        activate application "QuickTime Player"
        tell application "System Events"
            tell process "QuickTime Player"
                keystroke "E" using command down
                repeat until exists sheet 1 of window 1
                    delay 0.2
                end repeat
                click button "Export" of sheet 1 of window 1
            end tell
        end tell
        tell application "Finder"
            set fileExt to name extension of thisItem
        end tell
        set fileBaseName to basename(thisItem)
        set lengthWithoutExtension to (count of fileBaseName) - (count of fileExt) - 1
        set fileBaseNameWithoutExtension to text 1 thru lengthWithoutExtension of fileBaseName
        set end of referenceFiles to fileBaseNameWithoutExtension
        repeat until startedExporting(fileBaseNameWithoutExtension)
            -- wait for this file to start exporting before beginning another
        end repeat

    end repeat
    repeat until doneExporting(referenceFiles)
        -- wait for exporting to finish
    end repeat
    cleanUpGarbage(referenceFiles)
    tell application "QuickTime Player"
        activate
        close every window
        quit
    end tell
    display alert "finished exporting"
end open
on basename(thePath) -- Returns basename of alias
    set thePOSIXPath to the POSIX path of thePath
    if thePOSIXPath ends with "/" then
        set nameIndex to -2
    else
        set nameIndex to -1
    end if
    set ASTID to AppleScript's text item delimiters
    set AppleScript's text item delimiters to "/"
    set thePOSIXPath to text item nameIndex of thePOSIXPath
    set AppleScript's text item delimiters to ASTID
    return thePOSIXPath
end basename
on startedExporting(fileBaseNameWithoutExtension) -- Checks if QuickTime began exporting a file
    set moviesPath to QTExportPath as text
    set fileToTest to ((the POSIX path of moviesPath) & fileBaseNameWithoutExtension & "/Resources/" & fileBaseNameWithoutExtension & ".mov")
    if FileExists(fileToTest) then
        -- do nothing
    else
        return false
    end if
end startedExporting
on doneExporting(referenceFiles) -- Checks if QuickTime is done exporting everything
    set moviesPath to QTExportPath as text
    repeat with thisItem in referenceFiles
        set fileToTest to ((the POSIX path of moviesPath) & thisItem & "/Resources/" & thisItem & ".mov")
        if FileExists(fileToTest) then
            -- do nothing
        else
            return false
        end if
    end repeat
end doneExporting
on FileExists(theFile) -- (String) as Boolean
    tell application "System Events"
        if exists file theFile then
            return true
        else
            if exists folder theFile then
                return true
            else
                return false
            end if
        end if
    end tell
end FileExists
on cleanUpGarbage(referenceFiles)
    set moviesPath to QTExportPath as text
    set donePath to (QTExportPath as text) & completedFolderName as text
    set POSIXMovies to the POSIX path of moviesPath
    set POSIXDone to the POSIX path of donePath
    repeat with thisItem in referenceFiles
        set directoryToClean to (POSIXMovies & thisItem & "/")
        set m4vcommand to "find '" & directoryToClean & "' -type f -iname '*m4v' -exec cp -n {} '" & POSIXDone & "' \;"
        set movcommand to "find '" & directoryToClean & "' -type f -iname '*mov' -exec cp -n {} '" & POSIXDone & "' \;"

        do shell script m4vcommand
        do shell script movcommand
        set thefolder to POSIX file directoryToClean
        tell application "Finder"
            delete thefolder
        end tell
    end repeat
end cleanUpGarbage
on count_matches(this_list, this_item)
    set the match_counter to 0
    repeat with i from 1 to the count of this_list
        if item i of this_list is this_item then ¬
            set the match_counter to the match_counter + 1
    end repeat
    return the match_counter
end count_matches

它假设:

  • 您开始使用的文件夹只有电影文件,并且您希望转换所有文件
  • 通过手动导出到web,您已经在QuickTime中设置了所需的任何导出设置

它将一次导出一个。如果要同时转换多个文件,请修改startedExporting方法,使其仅检查文件夹而不是.mov文件(.mov文件是最后一个生成的文件)

最新更新