Skip to main content
Participant
May 13, 2017
해결됨

How to export a legacy title in new Premiere Pro CC Update

  • May 13, 2017
  • 4 답변들
  • 12066 조회

Hey,

Does anybody know how to export a legacy title in the new PP update? There's no longer a file --> export --> title option. Thanks.

[Here is the list of all Adobe forums... https://forums.adobe.com/welcome]

[Moved from generic Cloud/Setup forum to specific Program forum... Mod]

    이 주제는 답변이 닫혔습니다.
    최고의 답변: Ann Bens

    That's been a question here for some others, also, and I cant' figure it out myself.

    jstrawn​ or RameezKhan​ ... help?

    Neil


    I think the answer is no; the feature has been removed.

    4 답변

    Inspiring
    September 5, 2018

    You can do it with autohotkey script and offzip.exe

    http://aluigi.altervista.org/mytoolz/offzip.zip

    Offzip.exe should be placed in the same folder as script.

    Just select title and press F11.

    Tested on Premiere CC2017.

    SetBatchLines -1

    #If WinActive("ahk_class Premiere Pro")

    f11::

    if !FileExist("offzip.exe")

    {

       MsgBox, 262144, Error!, Error! Place offzip.exe in the folder of script!

       return

    }

    FileName := SaveFile([WinExist("A"), "Save Title"], "title001", {"Premiere Title": "`r*.prtl"}, ,0x00000002 | 0x00000004 | 0x10000000 | 0x02000000)

    If !FileName

      return

    tmp := ClipboardAll

    Clipboard := ""

    send ^{vk43} ; c

    ClipWait, 1, 1

    if ErrorLevel = 1

    {

       MsgBox, 262144, Error!, Error! ClipBoard is empty!

       Clipboard := tmp

       return

    }

    While !DllCall("OpenClipboard", "Ptr", 0)

       sleep 20

    formatCount := DllCall("CountClipboardFormats"), format:=0

    Loop % formatCount

    {

       format := DllCall("EnumClipboardFormats", "UInt", format)

       VarSetCapacity(formatName, 512)

       DllCall("GetClipboardFormatName", "Uint", format, "str", formatName, "Uint", 256)

       if Instr(formatName, "PProAE/Exchange")

          break

    }

    if !Instr(formatName, "PProAE/Exchange")

    {

       MsgBox, 262144, Error!, Error! ClipBoard does not have right format!

       DllCall("CloseClipboard")

       Clipboard := tmp

       return

    }

    hText := DllCall("GetClipboardData", "UInt", format, "UInt")

    pText := DllCall("GlobalLock", "UInt", hText, "UInt")

    DataText := StrGet(pText, "UTF-8")

    DllCall("GlobalUnlock", "UInt", hText)

    DllCall("CloseClipboard")

    Clipboard := tmp

    RegexMatch(DataText, "s)<ImporterPrefs Encoding=""base64"".+?>([^\s]+)\s*</ImporterPrefs>", match)

    if !match1

    {

       MsgBox, 262144, Error!, Error! ClipBoard does not have Premiere Title!

       return

    }

    n := tmpFile1 := tmpFile2 := ""

    loop 2

    {

       loop

       {

          n++

          if !FileExist("ahk" n ".tmp")

             break

          sleep 10

       }

       tmpFile%A_Index% := "AHK" n ".tmp"

    }

    Bytes := Base64Dec(BIN, match1)

    oFile := FileOpen(tmpFile1, "rw")

    oFile.RawWrite(BIN, Bytes)

    oFile.Pos := 32

    oFileContent := oFile.Read()

    oFile.Pos := 0

    oFile.Write(oFileContent)

    oFile.Close()

    RunWait, offzip.exe %tmpFile1% %tmpFile2%,,Hide

    FileRead, data, %tmpFile2%

    if !data

    {

       MsgBox, 262144, Error!, Error! ClipBoard does not have Premiere Title!

       loop 2

          FileDelete, % tmpFile%A_Index%

       return

    }

    FileMove, %tmpFile2%, %FileName%, 1

    if ErrorLevel

    {

       MsgBox, 262144, Error!, Error! Cannot create file!

       loop 2

          FileDelete, % tmpFile%A_Index%

       return

    }

    FileDelete, % tmpFile1

    MsgBox, 262144, Done, Done

    return

    #If

    Base64dec(ByRef OutData, ByRef InData)

    {

       DllCall("Crypt32.dll\CryptStringToBinary", Ptr, &InData, UInt, StrLen(InData), UInt,1, UInt,0, UIntP, Bytes, UIntP, 0, UIntP, 0)

       VarSetCapacity(OutData, Bytes)

       DllCall("Crypt32.dll\CryptStringToBinary",  Ptr, &InData, UInt, StrLen(InData), UInt,1, Str, OutData, UIntP, Bytes, UIntP, 0, UIntP, 0)

       Return Bytes

    }

    DirExist(DirName)

    {

        loop Files, % DirName, D

            return A_LoopFileAttrib

    }

    /*

        Displays a standard dialog that allows the user to save a file.

        Parameters:

            Owner / Title:

                The identifier of the window that owns this dialog. This value can be zero.

                An Array with the identifier of the owner window and the title. If the title is an empty string, it is set to the default.

            FileName:

                The path to the file or directory selected by default. If you specify a directory, it must end with a backslash.

            Filter:

                Specify a file filter. You must specify an object, each key represents the description and the value the file types.

                To specify the filter selected by default, add the "`n" character to the value of the key. By default, the first filter is selected.

                To specify the default extension that will be added to the file names, specify the "`r" character next to the extension.

                The default character to separate the extensions is ";". The spaces are omitted from the value.

            CustomPlaces:

                Specify an Array with the custom directories that will be displayed in the left pane. Missing directories will be omitted.

                To specify the location in the list, specify an Array with the directory and its location (0 = Lower, 1 = Upper).

            Options:

                Determines the behavior of the dialog. This parameter must be one or more of the following values.

                    0x00000002  (FOS_OVERWRITEPROMPT) = When saving a file, prompt before overwriting an existing file of the same name.

                    0x00000004  (FOS_STRICTFILETYPES) = Only allow the user to choose a file that has one of the file name extensions specified through Filter.

                    0x00040000 (FOS_HIDEPINNEDPLACES) = Hide items shown by default in the view's navigation pane.

                    0x10000000  (FOS_FORCESHOWHIDDEN) = Include hidden and system items.

                    0x02000000  (FOS_DONTADDTORECENT) = Do not add the item being opened or saved to the recent documents list (SHAddToRecentDocs).

                You can check all available values at https://msdn.microsoft.com/en-us/library/windows/desktop/dn457282(v=vs.85).aspx.

        Return:

            Returns 0 if the user canceled the dialog, otherwise returns the path of the selected file.

        Example:

            MsgBox % SaveFile( [0, "Dialog title - SaveFile.."]

                      , A_ComSpec

                      , {Music: "*.mp3", Images: "`n*.jpg;*.png", Videos: "*.avi;*.mp4;*.mkv;*.wmp", Documents: "*.txt"}

                      , [A_WinDir,A_Desktop,A_Temp,A_Startup,A_ProgramFiles]

                      , 0x00000002 | 0x00000004 | 0x10000000 | 0x02000000 )

    */

    SaveFile(Owner, FileName := "", Filter := "", CustomPlaces := "", Options := 0x6)

    {

        ; IFileSaveDialog interface

        ; https://msdn.microsoft.com/en-us/library/windows/desktop/bb775688(v=vs.85).aspx

        local IFileSaveDialog := ComObjCreate("{C0B4E2F3-BA21-4773-8DBA-335EC946EB8B}", "{84BCCD23-5FDE-4CDB-AEA4-AF64B83D78AB}")

            ,           Title := IsObject(Owner) ? Owner[2] . "" : ""

            ,           Flags := Options     ; FILEOPENDIALOGOPTIONS enumeration (https://msdn.microsoft.com/en-us/library/windows/desktop/dn457282(v=vs.85).aspx)

            ,      IShellItem := PIDL := 0   ; PIDL recibe la dirección de memoria a la estructura ITEMIDLIST que debe ser liberada con la función CoTaskMemFree

            ,             Obj := {}, foo := bar := ""

            ,       Directory := FileName

        Owner := IsObject(Owner) ? Owner[1] : (WinExist("ahk_id" . Owner) ? Owner : 0)

        Filter := IsObject(Filter) ? Filter : {"All files": "*.*"}

        if ( FileName != "" )

        {

            if ( InStr(FileName, "\") )

            {

                if !( FileName ~= "\\$" )    ; si «FileName» termina con "\" se trata de una carpeta

                {

                    local File := ""

                    SplitPath FileName, File, Directory

                    ; IFileDialog::SetFileName

                    ; https://msdn.microsoft.com/en-us/library/windows/desktop/bb775974(v=vs.85).aspx

                    DllCall(NumGet(NumGet(IFileSaveDialog+0)+15*A_PtrSize), "UPtr", IFileSaveDialog, "UPtr", &File)

                }

               

                while ( InStr(Directory,"\") && !DirExist(Directory) )                   ; si el directorio no existe buscamos directorios superiores

                    Directory := SubStr(Directory, 1, InStr(Directory, "\",, -1) - 1)    ; recupera el directorio superior

                if ( DirExist(Directory) )

                {

                    DllCall("Shell32.dll\SHParseDisplayName", "UPtr", &Directory, "Ptr", 0, "UPtrP", PIDL, "UInt", 0, "UInt", 0)

                    DllCall("Shell32.dll\SHCreateShellItem", "Ptr", 0, "Ptr", 0, "UPtr", PIDL, "UPtrP", IShellItem)

                    ObjRawSet(Obj, IShellItem, PIDL)

                    ; IFileDialog::SetFolder method

                    ; https://msdn.microsoft.com/en-us/library/windows/desktop/bb761828(v=vs.85).aspx

                    DllCall(NumGet(NumGet(IFileSaveDialog+0)+12*A_PtrSize), "Ptr", IFileSaveDialog, "UPtr", IShellItem)

                }

            }

            else    ; si «FileName» es únicamente el nombre de un archivo

                DllCall(NumGet(NumGet(IFileSaveDialog+0)+15*A_PtrSize), "UPtr", IFileSaveDialog, "UPtr", &FileName)

        }

        ; COMDLG_FILTERSPEC structure

        ; https://msdn.microsoft.com/en-us/library/windows/desktop/bb773221(v=vs.85).aspx

        local Description := "", FileTypes := "", FileTypeIndex := 1

        ObjSetCapacity(Obj, "COMDLG_FILTERSPEC", 2*Filter.Count() * A_PtrSize)

        for Description, FileTypes in Filter

        {

            loop parse, FileTypes, ";"            ; itera por todas las extensiones separadas por ";"

                if ( InStr(A_LoopField, "`r") )   ; si se especificó el caracter "`r" en la extensión actual

                    ; IFileDialog::SetDefaultExtension method

                    ; https://msdn.microsoft.com/en-us/library/windows/desktop/bb775970(v=vs.85).aspx

                    DllCall(NumGet(NumGet(IFileSaveDialog+0)+22*A_PtrSize), "UPtr", IFileSaveDialog, "Str", RegExReplace(A_LoopField,"\s*`n*`r*\**\.*"))

            FileTypeIndex := InStr(FileTypes,"`n") ? A_Index : FileTypeIndex

            ObjRawSet(Obj, "#" . A_Index, Trim(Description)), ObjRawSet(Obj, "@" . A_Index, RegExReplace(FileTypes,"\s*`n*`r*"))

            NumPut(ObjGetAddress(Obj,"#" . A_Index), ObjGetAddress(Obj,"COMDLG_FILTERSPEC") + A_PtrSize * 2*(A_Index-1))        ; COMDLG_FILTERSPEC.pszName

            NumPut(ObjGetAddress(Obj,"@" . A_Index), ObjGetAddress(Obj,"COMDLG_FILTERSPEC") + A_PtrSize * (2*(A_Index-1)+1))    ; COMDLG_FILTERSPEC.pszSpec

        }

        ; IFileDialog::SetFileTypes method

        ; https://msdn.microsoft.com/en-us/library/windows/desktop/bb775980(v=vs.85).aspx

        DllCall(NumGet(NumGet(IFileSaveDialog+0)+4*A_PtrSize), "UPtr", IFileSaveDialog, "UInt", Filter.Count(), "UPtr", ObjGetAddress(Obj,"COMDLG_FILTERSPEC"))

        ; IFileDialog::SetFileTypeIndex method

        ; https://msdn.microsoft.com/en-us/library/windows/desktop/bb775978(v=vs.85).aspx

        DllCall(NumGet(NumGet(IFileSaveDialog+0)+5*A_PtrSize), "UPtr", IFileSaveDialog, "UInt", FileTypeIndex)

        if ( IsObject(CustomPlaces := IsObject(CustomPlaces) || CustomPlaces == "" ? CustomPlaces : [CustomPlaces]) )

        {

            local Directory := ""

            for foo, Directory in CustomPlaces    ; foo = index

            {

                foo := IsObject(Directory) ? Directory[2] : 0    ; FDAP enumeration (https://msdn.microsoft.com/en-us/library/windows/desktop/bb762502(v=vs.85).aspx)

                if ( DirExist(Directory := IsObject(Directory) ? Directory[1] : Directory) )

                {

                    DllCall("Shell32.dll\SHParseDisplayName", "UPtr", &Directory, "Ptr", 0, "UPtrP", PIDL, "UInt", 0, "UInt", 0)

                    DllCall("Shell32.dll\SHCreateShellItem", "Ptr", 0, "Ptr", 0, "UPtr", PIDL, "UPtrP", IShellItem)

                    ObjRawSet(Obj, IShellItem, PIDL)

                    ; IFileDialog::AddPlace method

                    ; https://msdn.microsoft.com/en-us/library/windows/desktop/bb775946(v=vs.85).aspx

                    DllCall(NumGet(NumGet(IFileSaveDialog+0)+21*A_PtrSize), "UPtr", IFileSaveDialog, "UPtr", IShellItem, "UInt", foo)

                }

            }

        }

        ; IFileDialog::SetTitle method

        ; https://msdn.microsoft.com/en-us/library/windows/desktop/bb761834(v=vs.85).aspx

        DllCall(NumGet(NumGet(IFileSaveDialog+0)+17*A_PtrSize), "UPtr", IFileSaveDialog, "UPtr", Title == "" ? 0 : &Title)

        ; IFileDialog::SetOptions method

        ; https://msdn.microsoft.com/en-us/library/windows/desktop/bb761832(v=vs.85).aspx

        DllCall(NumGet(NumGet(IFileSaveDialog+0)+9*A_PtrSize), "UPtr", IFileSaveDialog, "UInt", Flags)

        ; IModalWindow::Show method

        ; https://msdn.microsoft.com/en-us/library/windows/desktop/bb761688(v=vs.85).aspx

        local Result := FALSE

        if ( !DllCall(NumGet(NumGet(IFileSaveDialog+0)+3*A_PtrSize), "UPtr", IFileSaveDialog, "Ptr", Owner, "UInt") )

        {

            ; IFileDialog::GetResult method

            ; https://msdn.microsoft.com/en-us/library/windows/desktop/bb775964(v=vs.85).aspx

            if ( !DllCall(NumGet(NumGet(IFileSaveDialog+0)+20*A_PtrSize), "UPtr", IFileSaveDialog, "UPtrP", IShellItem) )

            {

                VarSetCapacity(Result, 32767 * 2, 0)

                DllCall("Shell32.dll\SHGetIDListFromObject", "UPtr", IShellItem, "UPtrP", PIDL)

                DllCall("Shell32.dll\SHGetPathFromIDListEx", "UPtr", PIDL, "Str", Result, "UInt", 2000, "UInt", 0)

                ObjRawSet(Obj, IShellItem, PIDL)

            }

        }

        for foo, bar in Obj      ; foo = IShellItem interface (ptr)  |  bar = PIDL structure (ptr)

            if foo is integer    ; IShellItem?

                ObjRelease(foo), DllCall("Ole32.dll\CoTaskMemFree", "UPtr", bar)

        ObjRelease(IFileSaveDialog)

        return Result

    } ; https://github.com/flipeador/Library-AutoHotkey/blob/master/dlg/SaveFile.ahk

    Participant
    July 5, 2019

    This is just a very very basic utility written in "groovy" - which is a wrapper over Java, so you can run the following like a script.

    All it does is outputs the Title Text, plus any other base64 entries.  It would need a lot of refinement to be really useful - but it is a start

    import java.util.zip.Inflater

    import java.nio.*

    def tx = new XmlSlurper(false,true,true)

    tx.setFeature("http://apache.org/xml/features/disallow-doctype-decl", false)

    tx.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false)

    def pr = new XmlSlurper()

    def prx = pr.parse(new File("path to your project/premiere-test.prproj"))

    String decompress2(byte[] compressed) {

             // Decompress the bytes

         if (compressed.length <= 32)

             return new String(compressed, "unicode");

         xmlout = new ByteArrayOutputStream (10000)

         Inflater decompresser = new Inflater();

         decompresser.setInput(compressed, 32, compressed.length - 32);

         do {

             byte[] result = new byte[1000];

             int resultLength = decompresser.inflate(result);

             xmlout.write(result, 0, resultLength)

         } while (!decompresser.finished())

         finalSize = decompresser.bytesWritten

         println "   Final Length = $finalSize"

         decompresser.end();

         return new String(xmlout.toByteArray(), 0, finalSize as Integer, "unicode")

    }

    projData = prx.'**'.findAll { it.@Encoding == 'base64' }

    projData.each {

      try{

        println it.name()

        println it.attributes()

        bdat = (it.toString()).decodeBase64()

        if (it.name() == "ImporterPrefs") {

            itemData = decompress2 (bdat)

            if (itemData.size() > 32) {

    txml = tx.parseText( itemData )

    txtml = txml.'**'.findAll {txtN -> txtN.name() == 'TRString'}

    txtml.each {println it}

    } else {

      println "Short Data Item: $itemData"

    }

    } else {

    println "Base64 content: ${new String(bdat, "utf-8")}"

    }

    } catch ( x ) {

    println x

    }

    }

    andymees@aje
    Legend
    May 21, 2017

    The only current option is to install a earlier version of Premiere e.g. CC2015 ... I believe you should be able to install this alongside your current version?  If you need to build and export a PRTL file you would then create it and export it from CC2015.

    Appreciate that Adobe wants us to move forward with EGP/Title Tool, but they seem to have forgotten about the larger 3rd party ecosystem in their hurry for us to do so. A bit of a misstep, but perhaps not insurmountable if you keep an older version of Premiere installed specifically for that purpose.

    Ann Bens
    Community Expert
    Community Expert
    May 21, 2017

    You can install 2015 alongside 2017.

    I still have it on my computer.

    Participant
    May 20, 2017

    I am experiencing the same issue. Has anyone found a solution for this?

    Thank you

    Ann Bens
    Community Expert
    Community Expert
    May 20, 2017

    Make a separate project with the titles.

    When needed import via Media Browser from that project.

    Participant
    May 20, 2017

    I need to export the title as a prtl file to use in a subtitle program called PR SRT. do you know how to do that? it seems like the most recent premiere CC does't have this option anymore.

    R Neil Haugen
    Legend
    May 13, 2017

    Click on the title in the Project panel, right-click, clear down at the bottom ... "Export Media"

    Neil

    Everyone's mileage always varies ...
    Participant
    May 13, 2017

    Yea but I need a .prtl file...

    R Neil Haugen
    Legend
    May 13, 2017

    Oh ... yeah ...that's gone. And I just hunted all over to find any prtl files ... zip nada.

    Huh. This might have come up in another thread earlier ... go through the forum.

    Neil

    Everyone's mileage always varies ...