Macos Quicktime音频频道分配-左、右、左前、LFE等
我正在尝试修改以下Applescript代码,以将由视频和8个音频通道组成的多通道Quicktime文件的音频通道分配从默认的“Mono”更改为“Left、Right、Front Left、Front Right、LFE”等,这可以通过“Show Movie Properties/audio Settings”手动完成。下面的脚本成功更改了音频频道的“名称”,但我希望它更改“频道”分配,但我不知道如何使其工作。我是小牛队的Quicktime Pro 7Macos Quicktime音频频道分配-左、右、左前、LFE等,macos,audio,applescript,quicktime,Macos,Audio,Applescript,Quicktime,我正在尝试修改以下Applescript代码,以将由视频和8个音频通道组成的多通道Quicktime文件的音频通道分配从默认的“Mono”更改为“Left、Right、Front Left、Front Right、LFE”等,这可以通过“Show Movie Properties/audio Settings”手动完成。下面的脚本成功更改了音频频道的“名称”,但我希望它更改“频道”分配,但我不知道如何使其工作。我是小牛队的Quicktime Pro 7 on run open (choo
on run
open (choose file with prompt "Choose source file(s)" with multiple selections allowed)
end run
on open ff
repeat with f in ff
remap_sound_tracks_name(f's POSIX path)
end repeat
end open
on remap_sound_tracks_name(f)
(*
string f : POSIX path of source movie file
*)
script o
on map(n)
set mm to {¬
{"Sound Track 1", "Left"}, ¬
{"Sound Track 2", "Right"}, ¬
{"Sound Track 3", "Center"}, ¬
{"Sound Track 4", "LFE Screen"}, ¬
{"Sound Track 5", "Left Surround"}, ¬
{"Sound Track 6", "Right Surround"}, ¬
{"Sound Track 7", "Left Total"}, ¬
{"Sound Track 8", "Right Total"} ¬
}
repeat with m in mm
if m's item 1 = n then return m's item 2
end repeat
return n
end map
set f to f as POSIX file
tell application id "com.apple.quicktimeplayer" -- QuickTime Player 7
set dc to count documents
open f
repeat until (count documents) > dc
delay 0.2
end repeat
tell document 1
repeat with t in (get tracks whose audio channel count > 0)
set t to t's contents
set n to t's name
set n1 to my map(n)
if n1 ≠ n then set t's name to n1
end repeat
if modified then save
close
end tell
end tell
end script
tell o to run
end remap_sound_tracks_name
Hiroto在苹果论坛上回答了这个问题。它运行并工作,但速度相当慢:
(*
remap audio channel layouts.applescript
v0.1
*)
on run
open (choose file with prompt ("Choose movie file(s)") ¬
with multiple selections allowed)
end run
on open aa
set channel_layouts_map1 to {¬
{"Sound Track 1", "Sound Track 1", {"Left"}}, ¬
{"Sound Track 2", "Sound Track 2", {"Right"}}, ¬
{"Sound Track 3", "Sound Track 3", {"Center"}}, ¬
{"Sound Track 4", "Sound Track 4", {"LFE Screen"}}, ¬
{"Sound Track 5", "Sound Track 5", {"Left Surround"}}, ¬
{"Sound Track 6", "Sound Track 6", {"Right Surround"}}, ¬
{"Sound Track 7", "Sound Track 7", {"Left Total"}}, ¬
{"Sound Track 8", "Sound Track 8", {"Right Total"}} ¬
}
set channel_layouts_map2 to {¬
{"Sound Track 1", "Sound Track 1", {"Left"}}, ¬
{"Sound Track 2", "Sound Track 2", {"Right"}}, ¬
{"Sound Track 3", "Sound Track 3", {"Center"}}, ¬
{"Sound Track 4", "Sound Track 4", {"LFE Screen"}}, ¬
{"Sound Track 5", "Sound Track 5", {"Left Surround"}}, ¬
{"Sound Track 6", "Sound Track 6", {"Right Surround"}}, ¬
{"Sound Track 7", "Sound Track 7", {"Left Total", "Right Total"}} ¬
}
set channel_layouts_map3 to {¬
{"Sound Track 1", "Sound Track 7", {"Left"}}, ¬
{"Sound Track 2", "Sound Track 8", {"Right"}} ¬
}
set channel_layouts_map4 to {¬
{"Sound Track", "Sound Track", {"Left", "Right"}} ¬
}
repeat with a in aa
set f to a's POSIX path
set k to count_sound_tracks(f, {_close:false})
if k = 8 then
remap_audio_channels(f, channel_layouts_map1)
else if k = 7 then
remap_audio_channels(f, channel_layouts_map2)
else if k = 2 then
remap_audio_channels(f, channel_layouts_map3)
else if k = 1 then
remap_audio_channels(f, channel_layouts_map4)
else
-- ignore it (just close it)
close_document(f, {_save:false})
end if
end repeat
end open
on count_sound_tracks(f, {_close:_close})
(*
string f : POSIX path of QT movie
boolean _close: true to close document, false othewise
*)
tell application id "com.apple.quicktimeplayer" -- QuickTime Player 7 Pro
open (f as POSIX file)
tell (document 1 whose path = f)
repeat until exists
delay 0.2
end repeat
set k to count (tracks whose audio channel count > 0)
if _close then close
end tell
end tell
return k
end count_sound_tracks
on close_document(f, {_save:_save})
(*
string f : POSIX path of QT movie
boolean _save: true to save document (if modified), false othewise
*)
tell application id "com.apple.quicktimeplayer" -- QuickTime Player 7 Pro
tell (document 1 whose path = f)
if exists then
if _save and modified then save
close
end if
end tell
end tell
end close_document
on remap_audio_channels(f, channel_layouts_map)
(*
string f : POSIX path of source movie
list channel_layouts_map : list of {trk, trk_new, layouts}
trk = (string or integer) name or index of source sound track
trk_new = (string or integer) new name for source track (integer i denotes original name of sound track i)
layouts = list of audio channel layout for channel(s) in source sound track
Mono
Left
Right
Center
LFE Screen
Left Surround
Right Surround
Left Center
Right Center
Center Surround
Rear Surround Left
Rear Surround Right
Left Total
Right Total
Discrete-0
Discrete-1
Unused
e.g. 1
{{"Sound Track 1", "Left", {"Left"}}, ¬
{"Sound Track 2", "Right", {"Right"}}, ¬
{"Sound Track 3", "Center", {"Center"}}, ¬
{"Sound Track 4", "LFE Screen", {"LFE Screen"}}, ¬
{"Sound Track 5", "Left Surround", {"Left Surround"}}, ¬
{"Sound Track 6", "Right Surround", {"Right Surround"}}, ¬
{"Sound Track 7", "Left Total", {"Left Total"}}, ¬
{"Sound Track 8", "Right Total", {"Right Total"}}}
e.g. 2
{{1, 1, {"Left", "Right"}}, ¬
{2, 2, {"Center", "LFE, Screen"}}, ¬
{3, 3, {"Left Surround", "Right Surround"}}, ¬
{4, 4, {"Left Total", "Right Total"}}}
* this handler behaves as follows:
1) open f
2) scan sound tracks of document 1 for each trk and remap the track's audio channel layouts as specified
3) scan sound tracks of document 1 for each trk and rename the track as specified
4) save and close document 1
* if specified trk is not found, it is ignored and no remapping is performed on the track.
* if specified layout is not found, it is ignored and no remapping is performed on the layout.
* if specified layout count is greater than channel count of the target track, excessive layouts are ignored.
* if specified layout count is smaller than channel count of target track, excessive channels are ignored.
* if trk and trk_new denotes the same track, renaming is not performed on the track.
*)
script o
property map : channel_layouts_map
property pp : {}
property qq : {}
-- get name and id of sound tracks
tell application id "com.apple.quicktimeplayer" -- QuickTime Player 7 Pro
activate
open (f as POSIX file)
tell (document 1 whose path = f)
repeat until exists
delay 0.2
end repeat
tell (tracks whose audio channel count > 0)
set {pp, qq} to {name, id} -- name and id of sound tracks
end tell
end tell
end tell
-- remap audio channel layouts as specified
tell application "System Events"
tell (process 1 whose bundle identifier = "com.apple.quicktimeplayer")
-- open movie properties window
keystroke "j" using {command down}
tell (window 1 whose subrole = "AXDialog") -- properties for movie
repeat until exists
delay 0.2
end repeat
repeat with m in my map
set {trk, undef, layouts} to m
-- [TRK:
repeat 1 times
if trk's class = integer then
if trk < 1 or trk > (count my pp) then exit repeat -- TRK:
set trk to my pp's item trk
end if
tell scroll area 1
tell table 1
tell (row 1 whose text field 1's value = trk) -- target sound track whose name = trk
if not (exists) then exit repeat -- TRK:
select
end tell
end tell
end tell
tell tab group 1
click radio button 3 -- audio settings
tell scroll area 1
tell table 1 -- channel assignment table
set ix to count layouts
repeat with i from 1 to count rows
if i > ix then exit repeat
tell row i -- channel i
tell pop up button 1
click
tell menu 1 -- channel assignment menu
tell (menu item 1 whose title = layouts's item i)
if exists then click
end tell
end tell
end tell
end tell
end repeat
end tell
end tell
end tell
end repeat
-- /TRK:]
end repeat
-- close movie properties window
click (button 1 whose subrole = "AXCloseButton")
end tell
end tell
end tell
-- rename sound tracks as specified
tell application id "com.apple.quicktimeplayer"
tell document 1
repeat with m in my map
-- [RENAME:
repeat 1 times
set {x, y} to m's items 1 thru 2 -- {old name or index, new name or index}
if x's class = integer then
if x < 1 or x > (count my pp) then exit repeat -- RENAME:
else
set x to my _index_of(pp, x)
if x = 0 then exit repeat -- RENAME:
end if
if y's class = integer then
if y < 1 or y > (count my pp) then exit repeat -- RENAME:
set y to my pp's item y
end if
set p to my pp's item x
set q to my qq's item x
if p ≠ y then set track id q's name to y
end repeat
-- /RENAME:]
end repeat
if modified then save
close
end tell
end tell
end script
tell o to run
end remap_audio_channels
on _index_of(xx, x) -- renamed _bsearch() v0.1
(*
list xx : source list
anything x : item to be searched in xx
return integer : the first index of x in xx if {x} is in xx, or 0 if not.
*)
script o
property aa : xx
local i, j, k
if {x} is not in my aa then return 0
set i to 1
set j to count my aa
repeat while j > i
set k to (i + j) div 2
if {x} is in my aa's items i thru k then
set j to k
else
set i to k + 1
end if
end repeat
return i
end script
tell o to run
end _index_of
(*
重新映射音频频道布局。applescript
v0.1
*)
在逃
打开(在提示下选择文件(“选择电影文件”)
(允许多选)
终点
关于开放aa
将通道布局图1设置为{
{“音轨1”,“音轨1”,“左”}
{“音轨2”,“音轨2”,“右”}
{“音轨3”,“音轨3”,“中心”}
{“音轨4”,“音轨4”,“LFE屏幕”}
{“音轨5”,“音轨5”,“左环绕声”}
{“音轨6”,“音轨6”,“右环绕声”}
{“音轨7”,“音轨7”,“左总计”}
{“音轨8”,“音轨8”,“右总计”}
}
将通道布局图2设置为{
{“音轨1”,“音轨1”,“左”}
{“音轨2”,“音轨2”,“右”}
{“音轨3”,“音轨3”,“中心”}
{“音轨4”,“音轨4”,“LFE屏幕”}
{“音轨5”,“音轨5”,“左环绕声”}
{“音轨6”,“音轨6”,“右环绕声”}
{“音轨7”,“音轨7”,“左总计”,“右总计”}
}
将通道布局图3设置为{
{“音轨1”,“音轨7”,“左”}
{“音轨2”,“音轨8”,“右”}
}
将通道布局图4设置为{
{“音轨”,“音轨”,“左”,“右”}
}
在aa中用a重复
将f设置为a的POSIX路径
设置k以计数声音轨道(f,{u close:false})
如果k=8,则
重新映射音频通道(f,通道布局图1)
否则,如果k=7,则
重新映射音频通道(f,通道布局图2)
否则,如果k=2,则
重新映射音频通道(f,通道布局图3)
否则,如果k=1,则
重新映射音频通道(f,通道布局图4)
其他的
--忽略它(只需关闭它)
关闭文档(f,{u save:false})
如果结束
结束重复
断头
在计数音轨上(f,{{u close:{u close})
(*
字符串f:QT电影的POSIX路径
布尔值关闭:true表示关闭文档,false表示关闭文档
*)
告诉应用程序id“com.apple.quicktimeplayer”--quicktimeplayer7pro
打开(f作为POSIX文件)
告诉(路径为f的文档1)
重复,直到存在
延迟0.2
结束重复
将k设置为计数(音频通道计数>0的曲目)
如果关闭,则关闭
结束语
结束语
返回k
结束计数\u声音\u曲目
在关闭文档(f,{{u save:{u save})时
(*
字符串f:QT电影的POSIX路径
布尔值_save:如果为true,则保存文档(如果修改),否则为false
*)
告诉应用程序id“com.apple.quicktimeplayer”--quicktimeplayer7pro
告诉(路径为f的文档1)
如果存在,那么
如果保存并修改,则保存
关闭
如果结束
结束语
结束语
结束关闭文档
重新映射音频频道(f,频道布局图)
(*
字符串f:源电影的POSIX路径
列表频道布局图:列表{trk,trk\u new,layouts}
trk=(字符串或整数)源音轨的名称或索引
trk_new=(字符串或整数)源音轨的新名称(整数i表示音轨i的原始名称)
layouts=源音轨中频道的音频频道布局列表
单声道
左边
赖特
居中
LFE筛
左环绕
右环绕
左中
右中
中心环绕
左后环绕
右后环绕
左总
正确总数
离散-0
离散-1
未使用
e、 g.1
{{“音轨1”,“左”,“左”}
{“音轨2”,“右”,“右”}
{“音轨3”,“中间”,“中间”}
{“音轨4”,“LFE屏幕”,“LFE屏幕”}
{“音轨5”、“左环绕声”、“左环绕声”}
{“音轨6”、“右环绕”、“右环绕”}
{“音轨7”,“左总计”,“左总计”}
{“音轨8”,“右总计”,“右总计”}
e、 g.2
{1,1,{“左”,“右”}
{2,2,{“中心”,“LFE,屏幕”}
{3,3,{“左环绕”、“右环绕”}
{4,4,{“左总计”,“右总计”}
*此处理程序的行为如下所示:
1) 开放式f
2) 为每个trk扫描文档1的音轨,并按照规定重新映射音轨的音频通道布局
3) 为每个trk扫描文档1的音轨,并按规定重命名音轨
4) 保存并关闭文档1
*如果未找到指定的trk,将忽略该trk,并且不会在轨迹上执行重新映射。
*如果找不到指定的布局,将忽略该布局,并且不会对该布局执行重新映射