Weave Code
Code Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Php Shaka Laravel Package

aminyazdanpanah/php-shaka

View on GitHub
Deep Wiki
Context7
## Getting Started

### Minimal Setup
1. **Install the Package**
   ```bash
   composer require aminyazdanpanah/php-shaka

Ensure PHP 7.2+ is used (check php -v).

  1. Install Shaka Packager

    • Option A (Docker Recommended)
      docker pull google/shaka-packager
      
      Then configure the binary path in Laravel’s .env or runtime:
      $shaka = new \Shaka\ShakaPackager('path/to/shaka-packager');
      
    • Option B (Manual Binary) Download from Shaka Packager Releases and ensure it’s in PATH or specify its location.
  2. First Use Case: Basic DASH Packaging

    use Shaka\ShakaPackager;
    
    $packager = new ShakaPackager();
    $packager->addInput('input.mp4')
             ->setOutput('output.mpd')
             ->setStreamingFormat('dash')
             ->package();
    
    • Verify output.mpd and accompanying segments (init.mp4, segment*.mp4) are generated in the output directory.

Implementation Patterns

Core Workflows

1. Streaming Format Conversion

  • DASH (Dynamic Adaptive Streaming over HTTP)

    $packager->addInput('video.mp4')
             ->setOutput('dash_output.mpd')
             ->setStreamingFormat('dash')
             ->setDashSegmentDuration(4) // 4-second segments
             ->package();
    
    • Useful for adaptive bitrate streaming (e.g., YouTube, Netflix-like experiences).
  • HLS (HTTP Live Streaming)

    $packager->addInput('video.mp4')
             ->setOutput('hls_output.m3u8')
             ->setStreamingFormat('hls')
             ->setHlsSegmentDuration(6) // 6-second segments
             ->package();
    
    • Ideal for iOS compatibility or low-latency streaming.

2. DRM Integration

  • 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();
    

3. Live Streaming

  • HLS Live
    $packager->addInput('rtmp://input-stream')
             ->setOutput('live_hls_output.m3u8')
             ->setStreamingFormat('hls')
             ->setHlsLive(true)
             ->setHlsWindowSize(60) // 60-second window
             ->package();
    
    • Useful for broadcasting live events (e.g., sports, webinars).
    • Requires a live input source (e.g., RTMP, SRT).

4. Ad Insertion (SCTE-35)

$packager->addInput('video.mp4')
         ->setOutput('ads_output.mpd')
         ->setStreamingFormat('dash')
         ->addAdInsertion('ad_break.json') // JSON defining ad cues
         ->package();
  • Supports server-side ad insertion (SSAI) for DASH/HLS.
  • Example ad_break.json:
    {
      "ad_breaks": [
        {
          "time": 30, // seconds
          "ads": ["ad1.mp4", "ad2.mp4"]
        }
      ]
    }
    

5. Laravel Integration

  • Service Provider Register the packager in config/app.php:
    'providers' => [
        // ...
        App\Providers\ShakaServiceProvider::class,
    ],
    
    • Define a config file (config/shaka.php):
      return [
          'binary_path' => env('SHAKA_BINARY_PATH', '/usr/local/bin/shaka-packager'),
          'default_format' => 'dash',
      ];
      
    • Create a facade (app/Facades/Shaka.php):
      namespace App\Facades;
      
      use Illuminate\Support\Facades\Facade;
      
      class Shaka extends Facade {
          protected static function getFacadeAccessor() {
              return 'shaka';
          }
      }
      
    • Use in controllers:
      use App\Facades\Shaka;
      
      public function packageVideo() {
          Shaka::input('video.mp4')
               ->output('output.mpd')
               ->dash()
               ->package();
      }
      

Gotchas and Tips

Pitfalls

  1. Binary Path Issues

    • Error: ShakaPackagerException: Binary not found.
    • Fix: Explicitly set the binary path:
      $shaka = new \Shaka\ShakaPackager('/custom/path/to/shaka-packager');
      
    • Debug: Run which shaka-packager (Linux/Mac) or check PATH in Windows.
  2. DRM Key Server Misconfiguration

    • Error: DRM-protected streams fail to play with DRM_ERROR.
    • Fix:
      • Verify the key server URL is accessible (test with curl).
      • Ensure pssh data is correctly base64-encoded.
      • For Widevine, use Google’s test server for development:
        ->setWidevineKeyServer('https://widevine-test.com')
        ->setWidevinePssh(base64_encode(file_get_contents('pssh.bin')));
        
  3. Live Streaming Latency

    • Issue: High latency in HLS live streams.
    • Fix: Adjust hls_window_size (smaller = lower latency but less buffer):
      ->setHlsWindowSize(10) // 10-second window
      
  4. Ad Insertion Timing

    • Issue: Ads appear at wrong timestamps.
    • Fix: Validate ad_break.json with a tool like MP4Box.
    • Tip: Use absolute paths for ad assets in the JSON.
  5. Segment Duration Mismatch

    • Issue: Player stalls or buffers excessively.
    • Fix: Align segment duration with target devices (e.g., 4s for DASH, 6s for HLS).

Debugging Tips

  1. Enable Verbose Output

    $packager->setVerbose(true)->package();
    
    • Logs detailed Shaka Packager commands to stderr.
  2. Validate Output Manually

  3. Check Shaka Packager Logs

    • If using Docker, inspect logs:
      docker logs <container_id>
      

Configuration Quirks

  1. Docker Volume Mounts

    • If using Docker, mount the output directory:
      docker run -v $(pwd)/output:/output google/shaka-packager --input input.mp4 --output /output/output.mpd --streaming dash
      
  2. Memory Limits

    • Large files may hit PHP’s memory limit. Increase in php.ini:
      memory_limit = 2G
      
  3. Parallel Processing

    • For batch processing, use Laravel Queues:
      Shaka::dispatch()->input('video1.mp4')->output('output1.mpd')->dash()->package();
      

Extension Points

  1. Custom Shaka Packager Flags
    • Pass arbitrary flags via setOption():
      $packager->setOption('--dash-segment-template', 'segment_$RepresentationID$_$Number$.mp4');
      
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
facebook/capi-param-builder-php
babelqueue/symfony
hamzi/corewatch
minionfactory/raw-hydrator
hexters/coinpayment
rjcodes/rjcms
act-training/laravel-permissions-manager
alimarchal/laravel-chart-of-accounts
babenkoivan/elastic-scout-driver
mkwebdesign/filament-watchdog-v5
renatomarinho/laravel-page-speed
zedmagdy/filament-business-hours
renatovdemoura/blade-elements-ui
devgeek/beacon-admin
benjamin-rqt/data-watcher-bundle
atriumphp/atrium
sandermuller/package-boost-laravel
sandermuller/boost-skills
redaxo/core
yusufgenc/filament-api-forge