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
.m3u8playlists - DASH manifests: Universal
.mpdformat - 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
Segmentation
Independent Streaming
Other Support
Advanced Processing Features
Smart Resolution Scaling
Frame Rate Intelligence
HDR Processing
Adaptive Quality Ladders
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 processingprocessing- Video is being transcoded and packagedready- Processing complete, available for streamingerror- 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
Resolution: Upload Highest Available
Frame Rate: 30fps or 60fps
Audio: Opus Codec
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.