Video Processing Guide

Complete guide to automated video transcoding system producing multiple quality levels and adaptive streaming formats for efficient delivery on any device.

Coming soon: Advanced video processing will include AI-powered thumbnail generation and automated chapter detection, allowing for smarter preview selection and seamless navigation.

Once video upload is complete, RIXL encodes the file into various quality levels and adaptive streaming formats for reliable playback across all devices and network conditions.

Processing Architecture

Video processing uses a three-phase pipeline converting uploaded content into streaming-ready assets:

Analysis & Planning - Content analysis determines optimal rendition ladder

Multi-Quality Encoding - Parallel transcoding to multiple resolutions and bitrates

Adaptive Stream Packaging - HLS/DASH manifest generation for seamless delivery

Quality Tiers Explained

Choose a tier matching your content needs at upload initiation:

Standard web viewing with bandwidth efficiency:

  • 720p HD (1280×720) at 2.5 Mbps
  • 480p SD (854×480) at 1.0 Mbps
  • 240p Mobile (426×240) at 500 Kbps

Best for: General web content, tutorials, presentations

Tailored for short-form vertical content:

  • 1080p Full HD (1920×1080) at 4.0 Mbps, 60fps
  • 720p HD (1280×720) at 2.5 Mbps, 60fps
  • 480p SD (854×480) at 1.0 Mbps, 30fps

Best for: Social media content, mobile-first videos, vertical format

Premium quality with full resolution support:

  • 4K Ultra HD (3840×2160) at 15 Mbps, 60fps
  • 2K Quad HD (2560×1440) at 8.0 Mbps, 60fps
  • 1080p Full HD (1920×1080) at 4.0 Mbps, 60fps
  • Additional lower resolutions for adaptive streaming

Pro tier is best suited for professional content, broadcasts, and media with high-quality requirements.

Supported Input Formats

Recommended for fastest processing:

  • MP4 - H.264/H.265 video with Opus audio
  • MOV - QuickTime containers (Apple ecosystem)
  • WebM - VP8/VP9 with Vorbis/Opus audio

Also supported but may require longer processing:

  • MKV - Matroska container format
  • AVI - Legacy Windows format
  • FLV - Flash video format

Processing Pipeline Details

Content Analysis

Automatic metadata extraction:

  • Resolution, frame rate, and codec detection
  • Audio track analysis and separation
  • Content complexity assessment for bitrate selection
  • Aspect ratio preservation planning

Intelligent Encoding

Multi-rendition transcoding:

  • Primary codec: H.265 (HEVC) for efficiency
  • Other codec: H.264 for universal compatibility
  • Frame rate handling: 24fps to 60fps with NTSC support
  • Adaptive bitrates: Content-aware quality selection

Adaptive Streaming

Cross-platform delivery preparation:

  • HLS packaging: Apple-compatible .m3u8 playlists
  • DASH manifests: Universal .mpd format
  • 6-second segments: Efficient for low-latency streaming
  • CDN distribution: Global edge deployment

Audio Processing

RIXL conducts independent audio processing for efficient streaming:

Codec: Opus

128kbps, 48kHz for superior quality and compression

Segmentation

6-second audio segments for low-latency delivery

Independent Streaming

Audio served separately for efficient bandwidth usage

Other Support

Opus encoding for superior audio quality and compression

Advanced Processing Features

Smart Resolution Scaling

Preserves aspect ratios while targeting industry-standard resolutions

Frame Rate Intelligence

Maintains native frame rates and adapts for target platforms

HDR Processing

Supports HDR with BT.2020 color space and 10-bit encoding

Adaptive Quality Ladders

Generates multiple renditions even from low-resolution sources

Performance Characteristics

Processing Speed:

  • Basic tier: ~1x real-time processing
  • Shorts tier: ~1.5x real-time processing
  • Pro tier: ~2-3x real-time processing (4K content)

File Size Efficiency:

  • H.265 encoding: 30-50% smaller than H.264
  • Adaptive bitrates: Content-aware compression
  • Multiple renditions: Users receive the best quality for their connection

Processing Status Monitoring

Monitor your video's progress through the processing pipeline:

  • uploaded - Video successfully uploaded, awaiting processing
  • processing - Video is being transcoded and packaged
  • ready - Processing complete, available for streaming
  • error - Processing failed (check error message)
# Check processing status
curl "https://api.rixl.com/videos/{videoId}" \
-H "X-API-Key: YOUR_API_KEY"

Response includes:

  • Current status (uploaded, processing, ready, or error)
  • Estimated completion time (when processing)
  • Available renditions (when ready)
  • Error details (if error occurred)

Upload Preparation Guidelines

Source File Recommendations:

Format: MP4 + H.264

Fastest processing with universal compatibility

Resolution: Upload Highest Available

Up to 4K for Pro tier, system scales down appropriately

Frame Rate: 30fps or 60fps

Standard rates for efficient processing and compatibility

Audio: Opus Codec

Best compatibility and quality for source material

Large File Handling:

  • Multipart uploads automatically enabled for files >100MB
  • Resume capability for interrupted uploads
  • Parallel processing of multiple quality renditions

Implementation Best Practices

Quality Tier Selection:

  • Basic: Standard web content, bandwidth-conscious delivery
  • Shorts: Mobile-first content, social media delivery
  • Pro: Professional broadcasts, premium content experiences

Processing Efficiency:

  • Upload during off-peak hours for faster processing
  • Use recommended formats (MP4/H.264) to minimize processing time
  • Monitor processing status rather than polling continuously
  • Implement retry logic for failed uploads

Error Handling:

/**
* Video upload with TypeScript and comprehensive error handling
*/

interface VideoUploadOptions {
file_name: string;
video_quality: 'basic' | 'shorts' | 'pro';
image_format: 'jpg' | 'png' | 'webp';
}

interface UploadResponse {
video_id: string;
video_presigned_url: string;
expires_at: string;
}

async function uploadVideo(
videoFile: File,
apiKey: string,
options: VideoUploadOptions
): Promise
<string> {
  try {
  // Step 1: Initialize upload
  const initResponse = await fetch('https://api.rixl.com/videos/upload/init', {
  method: 'POST',
  headers: {
  'X-API-Key': apiKey,
  'Content-Type': 'application/json',
  'Accept': 'application/json'
},
  body: JSON.stringify(options)
});

  if (!initResponse.ok) {
  const errorData = await initResponse.json().catch(() => ({}));
  throw new Error(`Upload initialization failed: ${errorData.message || initResponse.statusText}`);
}

  const uploadData: UploadResponse = await initResponse.json();

  // Step 2: Upload video file
  const videoUpload = await fetch(uploadData.video_presigned_url, {
  method: 'PUT',
  body: videoFile,
  headers: {
  'Content-Type': videoFile.type || 'video/mp4'
}
});

  if (!videoUpload.ok) {
  throw new Error(`Video upload failed: ${videoUpload.statusText}`);
}

  // Step 3: Complete upload
  const completeResponse = await fetch(
  `https://api.rixl.com/videos/${uploadData.video_id}/upload/complete/`,
{
  method: 'POST',
  headers: {
  'X-API-Key': apiKey,
  'Content-Type': 'application/json'
}
}
  );

  if (!completeResponse.ok) {
  const errorData = await completeResponse.json().catch(() => ({}));
  throw new Error(`Upload completion failed: ${errorData.message || completeResponse.statusText}`);
}

  console.log('Video processing started successfully!');
  return uploadData.video_id;

} catch (error) {
  console.error('Upload failed:', error);
  throw error;
}
}

  // Usage example
  const handleUpload = async (file: File) => {
    const videoId = await uploadVideo(file, 'YOUR_PROJECT_API_KEY', {
    file_name: file.name,
    video_quality: 'pro',
    image_format: 'jpg'
  });

    console.log(`Upload successful! Video ID: ${videoId}`);
  };
"""
Modern Python video upload with proper error handling and type hints
"""

import requests
from typing import Dict, Any
from pathlib import Path
import logging

# Configure logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

class VideoUploadError(Exception):
"""Custom exception for video upload errors"""
pass

def upload_video(
file_path: Path,
api_key: str,
video_quality: str = 'pro',
image_format: str = 'jpg'
) -> str:
"""
Upload a video file to RIXL platform.

Args:
file_path: Path to the video file
api_key: Your RIXL project API key
video_quality: Quality tier ('basic', 'shorts', 'pro')
image_format: Thumbnail format ('jpg', 'png', 'webp')

Returns:
str: Video ID of the uploaded video

Raises:
VideoUploadError: If any step fails
"""

if not file_path.exists():
raise VideoUploadError(f"Video file not found: {file_path}")

session = requests.Session()
session.headers.update({
'X-API-Key': api_key,
'User-Agent': 'RIXL-Python-Client/1.0'
})

try:
# Step 1: Initialize upload
logger.info(f"Initializing upload for {file_path.name}")

init_response = session.post(
'https://api.rixl.com/videos/upload/init',
json={
'file_name': file_path.name,
'video_quality': video_quality,
'image_format': image_format
},
timeout=30
)

init_response.raise_for_status()
upload_data = init_response.json()

# Step 2: Upload video file
logger.info(" Uploading video file...")

with open(file_path, 'rb') as video_file:
upload_response = session.put(
upload_data['video_presigned_url'],
data=video_file,
headers={'Content-Type': 'video/mp4'},
timeout=300
)

upload_response.raise_for_status()

# Step 3: Complete upload
logger.info("Completing upload...")

complete_response = session.post(
f"https://api.rixl.com/videos/{upload_data['video_id']}/upload/complete/",
timeout=30
)

complete_response.raise_for_status()

video_id = upload_data['video_id']
logger.info(f"Upload successful! Video ID: {video_id}")

return video_id

except requests.exceptions.HTTPError as e:
error_msg = f"HTTP error: {e.response.status_code}"
if e.response.content:
try:
error_data = e.response.json()
error_msg += f" - {error_data.get('message', 'Unknown error')}"
except ValueError:
pass
raise VideoUploadError(error_msg) from e

except requests.exceptions.RequestException as e:
raise VideoUploadError(f"Network error: {str(e)}") from e

# Usage example
if __name__ == "__main__":
try:
video_id = upload_video(
file_path=Path("my-video.mp4"),
api_key="YOUR_PROJECT_API_KEY",
video_quality="pro"
)
print(f"Success! Video ID: {video_id}")

except VideoUploadError as e:
logger.error(f"Upload failed: {e}")
# 1. Initialize upload
curl -X POST https://api.rixl.com/videos/upload/init \
-H "X-API-Key: YOUR_PROJECT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"file_name": "my-video.mp4",
"video_quality": "pro",
"image_format": "jpg"
}'

# 2. Upload video (using presigned URL from response)
curl -X PUT "$VIDEO_PRESIGNED_URL" \
--upload-file my-video.mp4 \
-H "Content-Type: video/mp4"

# 3. Complete upload
curl -X POST https://api.rixl.com/videos/upload/complete/$VIDEO_ID \
-H "X-API-Key: YOUR_PROJECT_API_KEY"

Security and Access Control

Upload Security:

  • Time-limited signed URLs (valid for 1 hour)
  • MIME type and content validation

Delivery Security:

  • Project-scoped access controls

Troubleshooting Common Issues

Upload Failures:

  • Verify file size under 2GB limit
  • Check network stability for large files
  • Ensure the signed URL hasn't expired

Processing Delays:

  • Check current queue status via API
  • Contact support for processing over 2 hours
  • Consider using the Basic tier for faster turnaround

Playback Issues:

  • Verify all renditions have completed processing
  • Check CDN propagation status
  • Test with different quality levels

RIXL's video processing automatically prepares your content for all viewing scenarios, from mobile users on slow connections to desktop viewers with high-speed internet. The adaptive streaming ensures the best possible experience for each viewer.