【问题标题】:Automating encoding of videos (and creation of reference movie) for iOS为 iOS 自动编码视频(以及创建参考电影)
【发布时间】:2012-07-23 15:49:31
【问题描述】:
我的 iPad 应用让用户能够观看数百个视频。目前,iPad 应用程序将它们指向一个 MP4 文件。但是,我想将它们指向 QuickTime 参考电影。 (如果用户通过 3G 与 wifi 连接,这允许应用发送较低比特率版本的视频。)
现在,我通过转到文件 -> 导出到 Web 在 QuickTime 中创建各种版本以及参考文件。然而,这个过程 (1) 只允许我一次处理一个文件,并且 (2) 会生成许多无用的东西,例如 HTML 和 JavaScript。
如何实现流程自动化?有谁知道现有的脚本/工具来完成这项工作?我敢肯定其他开发者以前也必须这样做。
【问题讨论】:
标签:
ios
video
encoding
quicktime
【解决方案1】:
我编写(并从网络上的其他东西拼凑而成)这个 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
假设:
- 您开始的文件夹只有电影文件,并且您想要转换所有这些文件。
- 您已经在 QuickTime 中设置了所需的任何导出设置,方法是手动导出到网络
它会一次导出一个。如果你想同时转换多个,修改startedExporting方法只检查一个文件夹而不是.mov文件(.mov文件是最后一个生成的。)