'mp4a.40.34', 'aac' => 'mp4a.40.2', 'opus' => 'opus', ]; // @fixme use correct settings based on the file $videoCodecs = [ 'vp9' => 'vp09.00.10.08', 'h264' => 'avc1.42e00a', //'mpeg4' => 'mp4v.20.9', // fail? //'mpeg4' => 'mp4v.20', // Lies for desktop safari // 'mpeg4' => 'avc1', // lies // 'h263' => 'avc1', // lies // truths /* 'mjpeg' => 'jpeg', // works on current mac & ios 13, but not ios 10 'h263' => 's263', 'mpeg4' => 'mp4v', */ // These lies work on iOS 10 and iOS 13+ too 'mjpeg' => 'avc1.42e00a', // lies 'h263' => 'avc1.42e00a', // lies 'mpeg4' => 'avc1.42e00a', // lies // none of them seem to work on iOS 12! ]; while ( count( $argv ) > 0 ) { $track = array_shift( $argv ); [ $res, $codec, $ext ] = explode( '.', $track, 3 ); $filename = "$base.$res.$codec.$ext"; $playlist = "$filename.m3u8"; if ( $res === 'audio' ) { $name = 'English'; // @fixme use correct unknown marker $language = 'en-US'; // @fixme $channels = 2; // @fixme $uri = urlencode( $playlist ); $audio[$codec] = "#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID=\"$codec\",NAME=\"$name\",LANGUAGE=\"$language\",AUTOSELECT=YES,DEFAULT=YES,CHANNELS=\"$channels\",URI=\"$uri\""; } else { $bandwidth = 1250000; // @fixme $width = 854; // @fixme $height = 480; // @fixme $fps = 24.0; // @fixme $baseLine = "#EXT-X-STREAM-INF:BANDWIDTH=$bandwidth,RESOLUTION={$width}x{$height},FRAME-RATE={$fps}"; if ( count( $audio ) >= 1 ) { foreach ( array_keys( $audio ) as $audioCodec ) { $codecs = implode( ',', [ $videoCodecs[$codec], $audioCodecs[$audioCodec], ] ); $video[] = "$baseLine,CODECS=\"$codecs\",AUDIO=\"$audioCodec\""; $video[] = $playlist; } } else { $codecs = $videoCodecs[$codec]; $video[] = "$baseLine,CODECS=\"$codecs\""; $video[] = $playlist; } } } $header = [ '#EXTM3U', ]; $lines = array_merge( $header, array_values( $audio ), $video ); $m3u8 = implode( "\n", $lines ); print "$m3u8\n";