Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos Quicktime音频频道分配-左、右、左前、LFE等_Macos_Audio_Applescript_Quicktime - Fatal编程技术网

Macos Quicktime音频频道分配-左、右、左前、LFE等

Macos 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

我正在尝试修改以下Applescript代码,以将由视频和8个音频通道组成的多通道Quicktime文件的音频通道分配从默认的“Mono”更改为“Left、Right、Front Left、Front Right、LFE”等,这可以通过“Show Movie Properties/audio Settings”手动完成。下面的脚本成功更改了音频频道的“名称”,但我希望它更改“频道”分配,但我不知道如何使其工作。我是小牛队的Quicktime Pro 7

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,并且不会在轨迹上执行重新映射。
*如果找不到指定的布局,将忽略该布局,并且不会对该布局执行重新映射