Skip to main content
Participating Frequently
November 21, 2017
Question

Using video in captivate. Tips from the trenches.

  • November 21, 2017
  • 2 replies
  • 499 views

This last few days, I’ve had a pretty torrid time trying to work out the best way to implement videos within Captivate. Here’s what I learned...

Captivate has multiple ways of presenting video, all of which are challenging in their own unique and mystifying ways.

Event video

An event video is created when we use the media/video object to play a video. Simple enough. Videos are played in a native player. There are a few different flavours of player to choose from but there’s not much control over the functionality. Closed captions cannot be added to an event video. Captivate doesn’t know when an event video is finished, so it’s easy for the learner to get confused (has the video stalled or is it finished?). The lack of support for subtitles was the deal-breaker for me. I can't use event video.

Multi-slide synchronised (MSS) video

This option gives the author much more control over the video. As with event video, the video file is embedded into the course. If you want the video to stream (and you do) then you are going to need to set up a streaming server. I have no idea what this entails but I’m guessing that it is going to require someone technical, some software, some hardware, some time and some money. The lack of streaming functionality isn’t necessarily a deal-breaker if you’ve only got a bit of video content. But that’s not me. All my courses are based on multiple video clips. But here is the deal-breaker – the support for Closed Captions. While it is possible to add closed captions to a MSS video, it is incredibly difficult. The author is required to manually create ‘in’ points in the audio timeline for each phrase, and then manually enter the text of that phrase at each point. In the olden days, I might have just knuckled down and got on with. But when you see how Google has implemented the same functionality over on youtube, this quickly becomes a deal-breaker. We'll get to that.

The youtube ‘learning interaction’

A.k.a the youtube plug-in. This will accept a youtube URL and allow you to set some (but not all) of youtube’s configuration switches (autoplay, start time etc). It feels like the plugin is just going to make a call to youtube’s embedded player (https://www.youtube.com/embed/VIDEO_ID ). Except that it doesn’t work.

When I tried it, the ‘test’ button would always take me to http://www.youtube.com/v/ttps://yout. When I previewed the object in a browser, the video didn’t autoplay. And when I hit play, it just errored. There may well be workarounds for all these issues, but I hit so many of them so quickly that I assumed that the youtube ‘learning interaction’ was fundamentally flawed, and ran for the hills.

The web object

The web object allows authors to present web content. Perhaps it could be used to present youtube's embedded video player…? It can! This is great news because youtube has all of the functionality that I need:

  • Streaming video content
  • Global distribution
  • Auto-management of video quality based on learner’s bandwidth/device
  • Cheap (i.e. free)
  • Excellent support for closed captions
  • It works
  • Everyone is familiar with the interface and knows how to use it
  • There are lots of switches that can be pulled to control the look and feel, content and functionality

I think we have a winner. Now I just need to make it work within a web object.

To control how and what is presented, youtube lets you set switches on the URL. For example, if you want to set the height of the window (you do) then you use height=<value in px>. This is great because you are going to want to tailor the URL switches according to multiple things…

  1. Course design considerations (e.g. project and screen dimensions)
  2. Learner preferences (e.g. subtitles on or off)
  3. Progress (e.g. showing different videos as the learner progresses through the video)
  4. Content considerations (e.g. the starting position in the video)

Unfortunately, the web object requires a hardwired URL. I couldn’t find any way to dynamically generate the URL (based on the above considerations) and have that be the target for the web object. So basically, I need to separately create each youtube web object and then work out how to selectively present them to the user based on the above considerations.

This seems like the least worst option, so this is the path I am going down. The first thing that I need to do is to get Closed Captions working. By default, youtube automatically creates CCs for every video that anyone uploads. So I just need to set the ‘please show the closed captions on my video’ switch (cc_load_policy) to 1 and the subtitles are going to appear. Except that it doesn’t work. As it turns out, the cc_load_policy switch doesn’t work for automatically generated CCs. But I kept going on the assumption that there would be a solution – this is google, right? They know about this stuff.

It turns out that the cc_load_policy switch only works for curated CCs i.e. ones that have been created by a person (and not the ones created by youtube). And I was using the robot-generated ones. This is a 100% undocumented ‘feature’ and quite hard to find because it didn't make any sense (and still doesn't). So I head to the CC editor and edit the auto-generated text. Given the volume of videos that I have, I’m really not enjoying this ‘feature’ nor the prospect of the work ahead.

Happily, the editing process is a delight because youtube has got the CC text word perfect in about 99% of cases (‘2’ was ‘to’; ‘soldiered on’ was ‘Soldier Don’). And it has the timings correct in 100% of cases. A few quick edits and then its time to test the video in their helpful testing app https://developers.google.com/youtube/youtube_player_demo.

Ok great. The cc_load_policy switch now works. Well. Sort of. It works in Firefox but not so well in (google) Chrome. For some reason, Chrome is remembering my preference for CC and presenting captions even when the CC switch is off. That was another few hours lost working that out. I switch my default browser to Firefox.

Now it’s back to Captivate. My course has lots of video content. Some modules have 20+ snippets. The youtube interface helpfully presents a CC option allowing anyone to turn on subtitles on any video. But when there are 20+ videos in a single course, this isn’t really an option. No users want to hit the CC option 20 times. They’d be too busy shouting to learn anything. So I need to find a way of letting the users select CC at the start of the course (within Captivate) and then build the web object URL to reflect this preference.

As we know, the web object must have a hardwired URL so I need a way of dynamically selecting which hardwired web object gets displayed based on the user’s preference for CC. This feels like a good use of State. Captivate is quite happy for me to add state to a web object, so I add the URL that has no CCs as the default, and add a second cc_enabled state using the same URL but with the cc_load_policy=1 switch enabled. Captivate is happy with that. I preview in a browser and get an interesting effect. Both videos are playing simultaneously. Switching between states works for the visuals i.e. the subtitles go on and off as expected but the audio is playing twice. I have enabled two states at once. Awesome. This has to be a bug. All that needs to happen is for one state to pause when the other is enabled. Right now, they play in tandem. Back to the drawing board.

 

There might be a smart javascript way to solve this, but I’m not the right person for the job. So the only option left is to duplicate the video slide so that version one has no CC enabled and version 2 has CC enabled. I hate being forced into dumbness like this. I’m reminded of the goto command in Atari BASIC. And plus, this is going to get out of hand quickly if I want to be able to control more than one youtube switch. But right now I only have one. And so only need two slides and two versions of the web object. And a shared action on the previous slide that picks the correct slide based on the user preference. And a hardwired ‘jump to slide’ action on each slide to get to the right follow-on slide... So now I need to manually create alternative versions of each video, and set the routing on the before and after slides. And we’re done. Erg.

So, days later, I now have a project that uses a dozen videos and allows the user to pick their preference for CC as they progress through the course. The captions are 100% accurate and I’ve found a way through the minefield that is captivate+video.  Given that video is the future of e-learning I’m thinking that Adobe has got some work to do. None of which will be done in time to help me as I rinse and repeat and create another 7 multi-vid projects. The hard way.

Still reading?

Thanks to all on the forum that responded to my queries as I meandered towards a solution (you know who you are… TLCMediaDesign, Lilybiri, Paul_Wilson, RodWard et al). I’m pretty certain that your knowledge and generosity are keeping this ship afloat.

    This topic has been closed for replies.

    2 replies

    Participating Frequently
    November 22, 2017

    Thanks Erik.

    I was hopeful that this would work, but alas not. Whilst only one video is visible, the audio plays on both the visible and hidden one! Sigh.

    Erik Lord
    Inspiring
    November 22, 2017

    Excellent summary post. Love it. Thank you for writing!

    So one thought...since States didn't work as expected...can you not:

    0. Ask users at the start if they want captions or not, save that result in a variable.

    1. Place two Web Objects on one slide, set both to hidden.

    2. Set one with captions and one without.

    3. Setup an Advanced Action on SlideEnter that evaluates the CC variable and unhides the proper WebObject

    I've not tried this but seems like a worthwhile test.

    These sites may help with the process:

    Adobe Captivate 9: Advanced Actions Part 1 - Designed:2:Learn

    Adobe Captivate 9: Advanced Actions Part 2 - Designed:2:Learn

    Playing "Hide-and-seek" with Captivate objects - Captivate blog