Skip to content

Video Transcoder

AlexeyUna edited this page Feb 8, 2018 · 4 revisions

Video transcoder simplifies video conversion, extracting images from video and storing converted files. Main purpose is to resize and convert videos into different formats to play in all modern browsers using HTML5 video.

Conversion is performed using build-in ffmpeg (by default linux binary). It's possible to specify custom path to ffmpeg in inc/header.inc.php file:

define('BX_SYSTEM_FFMPEG', '/path/to/plugins/ffmpeg/ffmpeg.exe'); ///< path to ffmpeg binary

To generate video which plays in all moders browsers along with video poster, you need to create 3 different video transcoding objects which will generate .mp4, .webm videos and video poster. Video for conversion is queued and when cron is run (usually every minute) video conversion is performed.

Adding transcoder object

Transcoder object, source types, automatic deletion and filters works the same way as in Images transcoder. But there are several exceptions:

  • it is highly recommended to disable atime_pruning and atime_tracking, or set it to fairly big value, since video transcoding is not performed on the fly and takes some time.
  • video is converting upon first access, so it is probably better to force video conversion by calling BxDolTranscoderVideo::getFileUrl just after video uploading.
  • while video is pending for conversion or in the process then BxDolTranscoderVideo::getFileUrl methods returns empty string for video and predefined image for video poster.

Remote video transcoding

Video conversion can be performed on separate server or multiple servers, to do it:

  • install UNA on separate server(s), but connect to the same DB which your main site is using
  • enable 'Remote video transcoding' option (when it is enabled it takes a little longer to convert videos)
  • add the following code to the begining of inc/header.inc.php file on the main site, where your actual site in installed:
    define('BX_TRANSCODER_PROCESS_COMPLETED', '');
  • if you don't want your main site to convert videos, so all conversion will be performed on the separate server, then add the following code to the begining of inc/header.inc.php file on the main site:
    define('BX_TRANSCODER_NO_TRANSCODING', '');
  • all servers must have different host name
  • only main server must be used as site, additional sites are just for video conversion, don't perform any action on these sites

Filters

  • Mp4 - this filter convert video into .mp4 format along with resizing, the parameters are the following:
    • h - height of resulted video (360px by default), for video it is highly recommended to specify only height parameter (without width parameter), since videos have different aspect ratio, when only height only is specified, then width is automatically calculated using aspect ration of original video
    • video_bitrate - video bitrate (512k by default)
    • audio_bitrate - video bitrate (128k by default)
    • ffmpeg_options - additional command line options for ffmepeg, as key => value array (empty by default)
  • Webm - this filter convert video into .webm format along with resizing, the parameters are the same as for Mp4 filter
  • Poster - this filter generates video thumbnail, it tries to get poster at 0, 3 and 5 seconds from the beginning and gets the first not fully black/white thumb

Example of usage

bx_import('BxTemplFunctions');
bx_import('BxDolTranscoder');

// transcoder objects which generate .mp4, .webm videos and image poster
$oTranscoderMp4 = BxDolTranscoder::getObjectInstance('bx_video_mp4'); 
$oTranscoderWebm = BxDolTranscoder::getObjectInstance('bx_video_webm');
$oTranscoderPoster = BxDolTranscoder::getObjectInstance('bx_video_poster');

// make sure to call it only once (for example: during module installation), before the first usage, no need to call it every time
$oTranscoderMp4->registerHandlers(); 
$oTranscoderWebm->registerHandlers(); 
$oTranscoderPoster->registerHandlers(); 

// get URLs of transcoded videos and video thumbnail, 33 is ID of original video file stored in specified storage object
$sUrlMp4 = $oTranscoderMp4->getFileUrl(33);
$sUrlWebM = $oTranscoderWebm->getFileUrl(33);
$sUrlPoster = $oTranscoderPoster->getFileUrl(33);

echo 'My cat:' . BxTemplFunctions::getInstance()->videoPlayer($sUrlPoster, $sUrlMP4, $sUrlWebM);
You can’t perform that action at this time.