Skip to main content
Participant
December 5, 2017
Question

Encoding/charset of Source Text in exported GraphicAndType effect

  • December 5, 2017
  • 5 replies
  • 3937 views

I am currently working to programmatically editing Premiere projects exported as Final Cut Pro XML.

 

When editing text effects in the timeline I am having issues changing the text itself. The effect id is GraphicAndType and the parameter I'm having issues with is the source text. I am able to decode the text from base64, but unable to re-encode it in a way that lets premiere read it an create the edited text.

 

Does the source text require any specific charset/encoding or some kind of cryptographic cipher to work? I have attempted to re-encode from UTF-8, UTF-16 with all kinds of endians and byte order mark, and more. An example of the clip item with the effect can be forund here: [XML] Premiere Pro export XML - Pastebin.com

 

Or is there some easier way to achieve what I am trying to do?

 

NOTE: The text was originally created with the Essential Graphics tool

5 replies

Participant
November 12, 2023

Has anyone tried to decode one of these base64 Strings from a more recent version of Premiere? The sample <value> from this thread *does* indeed decode to a valid JSON string if you use UTF16-LE. But that does not work for XML output from the latest version of Premiere.

 

Here's an example that I cannot get to decode no matter what text encoding I try (I've attempted 28 so far):

 

<parameter authoringApp="PremierePro">
										<parameterid>1</parameterid>
										<name>Source Text</name>
										<hash>4e081bff-5365-dc02-2a20-2ed4000001a4</hash>
										<value>jAEAAAAAAABEMyIRDAAAAAAABgAKAAQABgAAAGQAAAAAAF4ARAAUABAAQAA8ADgAAAA0ADAAAAAAACwAAAAoAAAAJAAAACAAAAAAAAAAAAAAAAAAHAAAAAAAGgAAABkAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAgAAAAAABsABwBeAAAAAAAAATwAAAAAAAABSAAAAGAAAAAAAAEAAQAAAAAA8EEAACBBychIQiQAAAAAAMhCMzMjwQIAAAAAAERCAACtQ1z///9g////ZP///1b///8AAAAAAQAAAAQAAAAMAAAAQVZTcXVhZFNsYXRlAAAAAAEAAAAMAAAACAAOAAQACAAIAAAAhAAAADwAAAAAADYAHAAAABgAFAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAACAAEADYAAAACAAAAFAAAABgAAAAAAIBAKAAAAAAAJEL8////BAAEAAQAAAAEAAYABAAAAAAACgAIAAUABgAHAAoAAAAAgICABwAAADUuMTcuMjMA</value>
									</parameter>
Participant
April 17, 2020

I made an app which managed to import SRT file to pr in essential graphic title. It's Pr Titles and it is available on Mac App Store. You make a title on timeline and export the sequence to Final Cut Pro xml, then use SRT file and xml file to generate a new xml file which contains all subtitles from SRT file. Hope this doesn't bother. 

harryfear
Participating Frequently
December 13, 2018

Hi, folks!

After hours of headaches, I cracked it.

The <value> tag's contents is a base64-encoded JSON string, wrapped in some weird special characters. It's not related to the hash field. ‡

Original XML line:

<value>aAgAAAAAAAB7ACIAbQBUAGUAeAB0AFAAYQByAGEAbQAiADoAewAiAG0AQQBsAGkAZwBuAG0AZQBuAHQAIgA6ADAALAAiAG0ARABlAGYAYQB1AGwAdABSAHUAbgAiADoAWwBdACwAIgBtAEgAZQBpAGcAaAB0ACIAOgAwACwAIgBtAEgAaQBuAGQAaQBEAGkAZwBpAHQAcwAiADoAZgBhAGwAcwBlACwAIgBtAEkAbgBkAGkAYwAiADoAZgBhAGwAcwBlACwAIgBtAEkAcwBWAGUAcgB0AGkAYwBhAGwAVABlAHgAdAAiADoAZgBhAGwAcwBlACwAIgBtAEwAZQBhAGQAaQBuAGcAIgA6AC0AMwAsACIAbQBMAGkAZwBhAHQAdQByAGUAcwAiADoAZgBhAGwAcwBlACwAIgBtAFIAVABMACIAOgBmAGEAbABzAGUALAAiAG0AUwBoAGEAZABvAHcAQQBuAGcAbABlACIAOgAxADMANQAsACIAbQBTAGgAYQBkAG8AdwBCAGwAdQByACIAOgA0ADAALAAiAG0AUwBoAGEAZABvAHcAQwBvAGwAbwByACIAOgA0ADEANAA0ADkANQA5ACwAIgBtAFMAaABhAGQAbwB3AE8AZgBmAHMAZQB0ACIAOgA3ACwAIgBtAFMAaABhAGQAbwB3AE8AcABhAGMAaQB0AHkAIgA6ADcANQAsACIAbQBTAGgAYQBkAG8AdwBTAGkAegBlACIAOgAwACwAIgBtAFMAaABhAGQAbwB3AFYAaQBzAGkAYgBsAGUAIgA6AGYAYQBsAHMAZQAsACIAbQBTAHQAeQBsAGUAUwBoAGUAZQB0ACIAOgB7ACIAbQBCAGEAcwBlAGwAaQBuAGUATwBwAHQAaQBvAG4AIgA6AHsAIgBtAFAAYQByAGEAbQBWAGEAbAB1AGUAcwAiADoAWwBbADAALAAwAF0AXQB9ACwAIgBtAEIAYQBzAGUAbABpAG4AZQBTAGgAaQBmAHQAIgA6AHsAIgBtAFAAYQByAGEAbQBWAGEAbAB1AGUAcwAiADoAWwBbADAALAAwAF0AXQB9ACwAIgBtAEMAYQBwAHMATwBwAHQAaQBvAG4AIgA6AHsAIgBtAFAAYQByAGEAbQBWAGEAbAB1AGUAcwAiADoAWwBbADAALAAyAF0AXQB9ACwAIgBtAEYAYQB1AHgAQgBvAGwAZAAiADoAewAiAG0AUABhAHIAYQBtAFYAYQBsAHUAZQBzACIAOgBbAFsAMAAsAGYAYQBsAHMAZQBdAF0AfQAsACIAbQBGAGEAdQB4AEkAdABhAGwAaQBjACIAOgB7ACIAbQBQAGEAcgBhAG0AVgBhAGwAdQBlAHMAIgA6AFsAWwAwACwAZgBhAGwAcwBlAF0AXQB9ACwAIgBtAEYAaQBsAGwAQwBvAGwAbwByACIAOgB7ACIAbQBQAGEAcgBhAG0AVgBhAGwAdQBlAHMAIgA6AFsAWwAwACwAMQA2ADcANwA3ADIAMQA1AF0AXQB9ACwAIgBtAEYAaQBsAGwATwB2AGUAcgBTAHQAcgBvAGsAZQAiADoAewAiAG0AUABhAHIAYQBtAFYAYQBsAHUAZQBzACIAOgBbAFsAMAAsAHQAcgB1AGUAXQBdAH0ALAAiAG0ARgBpAGwAbABWAGkAcwBpAGIAbABlACIAOgB7ACIAbQBQAGEAcgBhAG0AVgBhAGwAdQBlAHMAIgA6AFsAWwAwACwAdAByAHUAZQBdAF0AfQAsACIAbQBGAG8AbgB0AE4AYQBtAGUAIgA6AHsAIgBtAFAAYQByAGEAbQBWAGEAbAB1AGUAcwAiADoAWwBbADAALAAiAFQAaQBtAGUAcwBOAGUAdwBSAG8AbQBhAG4AUABTAC0AQgBvAGwAZABNAFQAIgBdAF0AfQAsACIAbQBGAG8AbgB0AFMAaQB6AGUAIgA6AHsAIgBtAFAAYQByAGEAbQBWAGEAbAB1AGUAcwAiADoAWwBbADAALAA1ADgALgA4ADIANgAwADgANAAxADMANgA5ADYAMgA4ADkAMQBdAF0AfQAsACIAbQBLAGUAcgBuAGkAbgBnACIAOgB7ACIAbQBQAGEAcgBhAG0AVgBhAGwAdQBlAHMAIgA6AFsAWwAwACwAMABdAF0AfQAsACIAbQBTAHQAcgBvAGsAZQBDAG8AbABvAHIAIgA6AHsAIgBtAFAAYQByAGEAbQBWAGEAbAB1AGUAcwAiADoAWwBbADAALAAxADYANwA3ADcAMgAxADUAXQBdAH0ALAAiAG0AUwB0AHIAbwBrAGUAVgBpAHMAaQBiAGwAZQAiADoAewAiAG0AUABhAHIAYQBtAFYAYQBsAHUAZQBzACIAOgBbAFsAMAAsAGYAYQBsAHMAZQBdAF0AfQAsACIAbQBTAHQAcgBvAGsAZQBXAGkAZAB0AGgAIgA6AHsAIgBtAFAAYQByAGEAbQBWAGEAbAB1AGUAcwAiADoAWwBbADAALAAxAF0AXQB9ACwAIgBtAFQAZQB4AHQAIgA6ACIAQQBkAG8AYgBlACAARgBvAHIAdQBtACIALAAiAG0AVAByAGEAYwBrAGkAbgBnACIAOgB7ACIAbQBQAGEAcgBhAG0AVgBhAGwAdQBlAHMAIgA6AFsAWwAwACwAMABdAF0AfQAsACIAbQBUAHMAdQBtAGkAIgA6AHsAIgBtAFAAYQByAGEAbQBWAGEAbAB1AGUAcwAiADoAWwBbADAALAAwAF0AXQB9AH0ALAAiAG0AVABhAGIAVwBpAGQAdABoACIAOgA0ADAAMAAsACIAbQBXAGkAZAB0AGgAIgA6ADAAfQAsACIAbQBWAGUAcgBzAGkAbwBuACIAOgAxAH0A</value>

When decoded from base64, the gobbledygook is comprehensible:

ASCII readable string format (doesn't display fully as some characters are invisible): †

h {"mTextParam":{"mAlignment":0,"mDefaultRun":[],"mHeight":0,"mHindiDigits":false,"mIndic":false,"mIsVerticalText":false,"mLeading":-3,"mLigatures":false,"mRTL":false,"mShadowAngle":135,"mShadowBlur":40,"mShadowColor":4144959,"mShadowOffset":7,"mShadowOpacity":75,"mShadowSize":0,"mShadowVisible":false,"mStyleSheet":{"mBaselineOption":{"mParamValues":[[0,0]]},"mBaselineShift":{"mParamValues":[[0,0]]},"mCapsOption":{"mParamValues":[[0,2]]},"mFauxBold":{"mParamValues":[[0,false]]},"mFauxItalic":{"mParamValues":[[0,false]]},"mFillColor":{"mParamValues":[[0,16777215]]},"mFillOverStroke":{"mParamValues":[[0,true]]},"mFillVisible":{"mParamValues":[[0,true]]},"mFontName":{"mParamValues":[[0,"TimesNewRomanPS-BoldMT"]]},"mFontSize":{"mParamValues":[[0,58.826084136962891]]},"mKerning":{"mParamValues":[[0,0]]},"mStrokeColor":{"mParamValues":[[0,16777215]]},"mStrokeVisible":{"mParamValues":[[0,false]]},"mStrokeWidth":{"mParamValues":[[0,1]]},"mText":"Adobe Forum","mTracking":{"mParamValues":[[0,0]]},"mTsumi":{"mParamValues":[[0,0]]}},"mTabWidth":400,"mWidth":0},"mVersion":1}

As you can see, this example is for a graphic that says "Adobe Forum" in Times New Roman.

To change the text or font you would have your script:

– Decode from base64

– Replace the parts you want to replace like font or text or font size

– Re-encode for base64

– Re-place between two value tags.

Have a play. Reach out if you need any help.


Valid for Premiere Pro version 12.1.1.

This example Essential Graphic <value> is saved on a pastebin​ for posterity in ASCII, hex and base64 formats. For reference, the whole FCP XML (from which the <value> is taken is here.

More:

† It's safer to do a replace of the valid Premiere Pro-generated string because of the special characters and the top and bottom of the string. If you try to build a fresh JSON object and base64-encode it, it won't work in Premiere Pro because of the missing special characters at the top and bottom.

‡ And, to re-state, the hash tag is irrelevant.

The example graphic is this:

1.jpg

2.jpg

harryfear
Participating Frequently
December 13, 2018

Regarding encoding, I processed things on a web-server-side in UTF-16 and that cracked it.

ManuVS
Participant
February 14, 2019

Hi harryfear,

first of all, thank you very much for your solution to the problem raised by TeamHaxor.

I tried your workflow, decoding the base64 string wich returns something like: "¶{"mTextParam":{"mAlignment".

However, I'm unable to replace nothing from this resulting string as it seems to have a length of 1 (the first special char).

I tried in PHP and AS3 (code below) with the same result.

I would appreciate some help.

Thanks in advance.

- - - - - - - - - -

import mx.utils.*;

import flash.utils.ByteArray;

var base64Code:String = 'tgYAAAAAAAB7ACIAbQBUAGUAeAB0AFAAYQByAGEAbQAiADoAewAiAG0AQQBsAGkAZwBuAG0AZQBuAHQAIgA6ADIALAAiAG0ARABlAGYAYQB1AGwAdABSAHUAbgAiADoAWwBdACwAIgBtAEgAZQBpAGcAaAB0ACIAOgAwACwAIgBtAEgAaQBuAGQAaQBEAGkAZwBpAHQAcwAiADoAZgBhAGwAcwBlACwAIgBtAEkAbgBkAGkAYwAiADoAZgBhAGwAcwBlACwAIgBtAEkAcwBWAGUAcgB0AGkAYwBhAGwAVABlAHgAdAAiADoAZgBhAGwAcwBlACwAIgBtAEwAZQBhAGQAaQBuAGcAIgA6ADAALAAiAG0ATABpAGcAYQB0AHUAcgBlAHMAIgA6AGYAYQBsAHMAZQAsACIAbQBSAFQATAAiADoAZgBhAGwAcwBlACwAIgBtAFMAaABhAGQAbwB3AEEAbgBnAGwAZQAiADoAMQAzADUALAAiAG0AUwBoAGEAZABvAHcAQgBsAHUAcgAiADoAMAAsACIAbQBTAGgAYQBkAG8AdwBDAG8AbABvAHIAIgA6ADAALAAiAG0AUwBoAGEAZABvAHcATwBmAGYAcwBlAHQAIgA6ADEAMAAsACIAbQBTAGgAYQBkAG8AdwBPAHAAYQBjAGkAdAB5ACIAOgAxADAAMAAsACIAbQBTAGgAYQBkAG8AdwBWAGkAcwBpAGIAbABlACIAOgBmAGEAbABzAGUALAAiAG0AUwB0AHkAbABlAFMAaABlAGUAdAAiADoAewAiAG0AQgBhAHMAZQBsAGkAbgBlAFMAaABpAGYAdAAiADoAewAiAG0AUABhAHIAYQBtAFYAYQBsAHUAZQBzACIAOgBbAFsAMAAsADAAXQBdAH0ALAAiAG0ARgBpAGwAbABDAG8AbABvAHIAIgA6AHsAIgBtAFAAYQByAGEAbQBWAGEAbAB1AGUAcwAiADoAWwBbADAALAAxADYANwA3ADcAMgAxADUAXQBdAH0ALAAiAG0ARgBpAGwAbABPAHYAZQByAFMAdAByAG8AawBlACIAOgB7ACIAbQBQAGEAcgBhAG0AVgBhAGwAdQBlAHMAIgA6AFsAWwAwACwAdAByAHUAZQBdAF0AfQAsACIAbQBGAGkAbABsAFYAaQBzAGkAYgBsAGUAIgA6AHsAIgBtAFAAYQByAGEAbQBWAGEAbAB1AGUAcwAiADoAWwBbADAALAB0AHIAdQBlAF0AXQB9ACwAIgBtAEYAbwBuAHQATgBhAG0AZQAiADoAewAiAG0AUABhAHIAYQBtAFYAYQBsAHUAZQBzACIAOgBbAFsAMAAsACIATAB1AGMAaQBkAGEARwByAGEAbgBkAGUAIgBdAF0AfQAsACIAbQBGAG8AbgB0AFMAaQB6AGUAIgA6AHsAIgBtAFAAYQByAGEAbQBWAGEAbAB1AGUAcwAiADoAWwBbADAALAA0ADgAXQBdAH0ALAAiAG0ASwBlAHIAbgBpAG4AZwAiADoAewAiAG0AUABhAHIAYQBtAFYAYQBsAHUAZQBzACIAOgBbAFsAMAAsADAAXQBdAH0ALAAiAG0AUwB0AHIAbwBrAGUAQwBvAGwAbwByACIAOgB7ACIAbQBQAGEAcgBhAG0AVgBhAGwAdQBlAHMAIgA6AFsAWwAwACwAMABdAF0AfQAsACIAbQBTAHQAcgBvAGsAZQBWAGkAcwBpAGIAbABlACIAOgB7ACIAbQBQAGEAcgBhAG0AVgBhAGwAdQBlAHMAIgA6AFsAWwAwACwAdAByAHUAZQBdAF0AfQAsACIAbQBTAHQAcgBvAGsAZQBXAGkAZAB0AGgAIgA6AHsAIgBtAFAAYQByAGEAbQBWAGEAbAB1AGUAcwAiADoAWwBbADAALAAwAF0AXQB9ACwAIgBtAFQAZQB4AHQAIgA6ACIASABpACwAIABJABkgbQAgAEEAbABpAGMAZQAuACAAIAAiACwAIgBtAFQAcgBhAGMAawBpAG4AZwAiADoAewAiAG0AUABhAHIAYQBtAFYAYQBsAHUAZQBzACIAOgBbAFsAMAAsADAAXQBdAH0ALAAiAG0AVABzAHUAbQBpACIAOgB7ACIAbQBQAGEAcgBhAG0AVgBhAGwAdQBlAHMAIgA6AFsAWwAwACwAMABdAF0AfQB9ACwAIgBtAFQAYQBiAFcAaQBkAHQAaAAiADoANAAwADAALAAiAG0AVwBpAGQAdABoACIAOgAwAH0ALAAiAG0AVgBlAHIAcwBpAG8AbgAiADoAMQB9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA';

var b64:Base64Decoder = new Base64Decoder();

b64.decode( base64Code );

var decoded = b64.toByteArray();

decoded = decoded.toString();

trace( decoded.length );

trace( decoded );

var decodedReplaced = decoded.replace( 'mAlignment','whatever' );

trace( decodedReplaced );

Participant
July 2, 2018

hey ya

Did you ever get to the bottom of this? I'm having the same issue. It would seem that the <value> element is base64 encoded, using an online decoder it outputs a json object containing parameters and the text value. But editing and then re-encoding to base64, produces no text when you import the xml back into premiere.

Cheers

Participant
April 8, 2018

I'm in the same boat, I assume it has to do with the hash field, how do they calculate it?