## Getting Started
### Minimal Setup
1. **Install the Package**
```bash
composer require aminyazdanpanah/php-shaka
Ensure PHP 7.2+ is used (check php -v).
Install Shaka Packager
docker pull google/shaka-packager
Then configure the binary path in Laravel’s .env or runtime:
$shaka = new \Shaka\ShakaPackager('path/to/shaka-packager');
PATH or specify its location.First Use Case: Basic DASH Packaging
use Shaka\ShakaPackager;
$packager = new ShakaPackager();
$packager->addInput('input.mp4')
->setOutput('output.mpd')
->setStreamingFormat('dash')
->package();
output.mpd and accompanying segments (init.mp4, segment*.mp4) are generated in the output directory.DASH (Dynamic Adaptive Streaming over HTTP)
$packager->addInput('video.mp4')
->setOutput('dash_output.mpd')
->setStreamingFormat('dash')
->setDashSegmentDuration(4) // 4-second segments
->package();
HLS (HTTP Live Streaming)
$packager->addInput('video.mp4')
->setOutput('hls_output.m3u8')
->setStreamingFormat('hls')
->setHlsSegmentDuration(6) // 6-second segments
->package();
Widevine (Google’s DRM)
$packager->addInput('video.mp4')
->setOutput('drm_output.mpd')
->setStreamingFormat('dash')
->setWidevineKeyServer('https://your-key-server.com')
->setWidevinePssh('base64_pssh_data')
->package();
PlayReady (Microsoft’s DRM)
$packager->addInput('video.mp4')
->setOutput('playready_output.mpd')
->setStreamingFormat('dash')
->setPlayReadyKeyServer('https://your-playready-server.com')
->setPlayReadyLicenseAcquisitionUrl('https://your-la-url.com')
->package();
$packager->addInput('rtmp://input-stream')
->setOutput('live_hls_output.m3u8')
->setStreamingFormat('hls')
->setHlsLive(true)
->setHlsWindowSize(60) // 60-second window
->package();
$packager->addInput('video.mp4')
->setOutput('ads_output.mpd')
->setStreamingFormat('dash')
->addAdInsertion('ad_break.json') // JSON defining ad cues
->package();
ad_break.json:
{
"ad_breaks": [
{
"time": 30, // seconds
"ads": ["ad1.mp4", "ad2.mp4"]
}
]
}
config/app.php:
'providers' => [
// ...
App\Providers\ShakaServiceProvider::class,
],
config/shaka.php):
return [
'binary_path' => env('SHAKA_BINARY_PATH', '/usr/local/bin/shaka-packager'),
'default_format' => 'dash',
];
app/Facades/Shaka.php):
namespace App\Facades;
use Illuminate\Support\Facades\Facade;
class Shaka extends Facade {
protected static function getFacadeAccessor() {
return 'shaka';
}
}
use App\Facades\Shaka;
public function packageVideo() {
Shaka::input('video.mp4')
->output('output.mpd')
->dash()
->package();
}
Binary Path Issues
ShakaPackagerException: Binary not found.$shaka = new \Shaka\ShakaPackager('/custom/path/to/shaka-packager');
which shaka-packager (Linux/Mac) or check PATH in Windows.DRM Key Server Misconfiguration
DRM_ERROR.curl).pssh data is correctly base64-encoded.->setWidevineKeyServer('https://widevine-test.com')
->setWidevinePssh(base64_encode(file_get_contents('pssh.bin')));
Live Streaming Latency
hls_window_size (smaller = lower latency but less buffer):
->setHlsWindowSize(10) // 10-second window
Ad Insertion Timing
ad_break.json with a tool like MP4Box.Segment Duration Mismatch
Enable Verbose Output
$packager->setVerbose(true)->package();
stderr.Validate Output Manually
.mpd/.m3u8 files:
MP4Box -dash 1000 output.mpd
Check Shaka Packager Logs
docker logs <container_id>
Docker Volume Mounts
docker run -v $(pwd)/output:/output google/shaka-packager --input input.mp4 --output /output/output.mpd --streaming dash
Memory Limits
php.ini:
memory_limit = 2G
Parallel Processing
Shaka::dispatch()->input('video1.mp4')->output('output1.mpd')->dash()->package();
setOption():
$packager->setOption('--dash-segment-template', 'segment_$RepresentationID$_$Number$.mp4');
How can I help you explore Laravel packages today?