From a3844d9c44bc2acde431c34811e702d5fdbabe5b Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Wed, 8 Mar 2023 11:21:37 -0800 Subject: [PATCH] WIP m3u8 gen --- make-fmp4.sh | 26 +++++++++++--------- meta-playlist.php | 61 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+), 11 deletions(-) create mode 100644 meta-playlist.php diff --git a/make-fmp4.sh b/make-fmp4.sh index 07cfcb7..ebeaf67 100755 --- a/make-fmp4.sh +++ b/make-fmp4.sh @@ -1,5 +1,6 @@ interval=10 -MOVFLAGS="-movflags +frag_keyframe+empty_moov -force_key_frames expr:gte(t,n_forced*$interval)" +#MOVFLAGS="-movflags +frag_keyframe+empty_moov -force_key_frames expr:gte(t,n_forced*$interval)" +MOVFLAGS="-movflags +frag_keyframe+empty_moov" AUDFLAGS="-movflags +empty_moov -frag_duration ${interval}000000" BITRATE_HI="-b:v 1250k" BITRATE_LO="-b:v 1000k" @@ -18,20 +19,23 @@ INFILE=caminandes-llamigos.webm set -e # Audio for HLS -ffmpeg -i $INFILE -vn $AUDIO_MP3 -y fmp4.audio.mp3 +ffmpeg -i $INFILE -vn $AUDIO_MP3 -y fmp4.audio.mpeg.mp3 ffmpeg -i $INFILE -vn $AUDIO_AAC $AUDFLAGS -y fmp4.audio.aac.mp4 ffmpeg -i $INFILE -vn $AUDIO_OPUS $AUDFLAGS -y fmp4.audio.opus.mp4 # Video for HLS -ffmpeg -i $INFILE -an $VIDEO_H264 $MOVFLAGS -pass 1 -y fmp4.video.h264.mp4 -ffmpeg -i $INFILE -an $VIDEO_H264 $MOVFLAGS -pass 2 -y fmp4.video.h264.mp4 +ffmpeg -i $INFILE -an $VIDEO_H264 $MOVFLAGS -pass 1 -y fmp4.480p.h264.mp4 +ffmpeg -i $INFILE -an $VIDEO_H264 $MOVFLAGS -pass 2 -y fmp4.480p.h264.mp4 -ffmpeg -i $INFILE -an $VIDEO_VP9 $MOVFLAGS -pass 1 -y fmp4.video.vp9.mp4 -ffmpeg -i $INFILE -an $VIDEO_VP9 $MOVFLAGS -pass 2 -y fmp4.video.vp9.mp4 +ffmpeg -i $INFILE -an $VIDEO_VP9 $MOVFLAGS -pass 1 -y fmp4.480p.vp9.mp4 +ffmpeg -i $INFILE -an $VIDEO_VP9 $MOVFLAGS -pass 2 -y fmp4.480p.vp9.mp4 # Playlist processing -#php extract-playlist.php fmp4.audio.mp3 fmp4.audio.mp3.m3u8 -#php extract-playlist.php fmp4.audio.aac.mp4 fmp4.audio.aac.mp4.m3u8 -#php extract-playlist.php fmp4.audio.opus.mp4 fmp4.audio.opus.mp4.m3u8 -#php extract-playlist.php fmp4.video.h264.mp4 fmp4.video.h264.mp4.m3u8 -#php extract-playlist.php fmp4.video.vp9.mp4 fmp4.video.vp9.mp4.m3u8 +php extract-playlist.php fmp4.audio.mpeg.mp3 > fmp4.audio.mpeg.mp3.m3u8 +php extract-playlist.php fmp4.audio.aac.mp4 > fmp4.audio.aac.mp4.m3u8 +php extract-playlist.php fmp4.audio.opus.mp4 > fmp4.audio.opus.mp4.m3u8 +php extract-playlist.php fmp4.480p.h264.mp4 > fmp4.480p.h264.mp4.m3u8 +php extract-playlist.php fmp4.480p.vp9.mp4 > fmp4.480p.vp9.mp4.m3u8 + +php meta-playlist.php fmp4 audio.opus.mp4 audio.mpeg.mp3 480p.vp9.mp4 > fmp4.vp9.m3u8 +php meta-playlist.php fmp4 audio.opus.mp4 audio.mpeg.mp3 480p.vp9.mp4 480p.h264.mp4 > fmp4.vp9-h264.m3u8 diff --git a/meta-playlist.php b/meta-playlist.php new file mode 100644 index 0000000..e1f7f04 --- /dev/null +++ b/meta-playlist.php @@ -0,0 +1,61 @@ + 'mp4a.40.34', + 'opus' => 'opus' +]; + +// @fixme use correct settings based on the file +$videoCodecs = [ + 'vp9' => 'vp09.00.10.08', + 'h264' => 'avc1.42e00a', +]; + + +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( $filename ); + $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-INFO: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], + ] ); + $line = "$baseLine,CODECS=\"$codecs\""; + } + } else { + $codecs = $videoCodecs[$codec]; + $line = "$baseLine,CODECS=\"$codecs\",AUDIO=\"$audioCodec\""; + } + } +} + +$lines = array_concat( + [ '#EXTM3U' ], + array_values( $audio ), + $video +); + +$m3u8 = implode( "\n", $lines ); +print $m3u8;