├── .gitignore ├── encoder ├── README.md ├── templates │ ├── file-fc-rtmp-2s-720p │ ├── file-tc-cmaf-6s-sbr-720p24 │ ├── file-tc-cmaf-6s-abr-1080p │ ├── file-tc-dash-ll-2s-720p │ └── file-tc-dash-ll-2s-abr-1080p ├── install.sh └── install.yaml ├── LICENSE ├── README.md └── index.html /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | .DS_Store 3 | -------------------------------------------------------------------------------- /encoder/README.md: -------------------------------------------------------------------------------- 1 | # encoder 2 | This is an simple install script to deploy ffmpeg and a script generated by ffbuilder onto a linux machine. 3 | 4 | The script is available as an Ansible playbook and straightforward bash script 5 | 6 | An Akamai Compute (Linode) StackScript to automagically deploy and config a VM can be found here: 7 | https://cloud.linode.com/stackscripts/1108162 8 | 9 | The script performs the following functions: 10 | - Add repos for ffmpeg, graphics and multimedia 11 | - Install ffmpeg, npm and fonts-freefont-ttf 12 | - Install PM2 (from npm) 13 | - Download test file to be used by the script (specified as a parameter) 14 | - Download a script generated by ffmpeg, examples in templates folder 15 | - (Optionally) modify the script with user supplied environment variables (like stream id, event name, entrypoint, etc) 16 | - Run the script within pm2, making it start on boot, restart failure 17 | - Set a cron task to restart the encoder every night at 1am 18 | -------------------------------------------------------------------------------- /encoder/templates/file-fc-rtmp-2s-720p: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | #Generated by command builder r0.3j 4 | #Script expect one variables to be set 'rtmp_url' 5 | 6 | timestamp="$(date +%s)" 7 | 8 | ffmpeg \ 9 | \ 10 | -re -fflags +genpts -stream_loop -1 -i testclip.mp4 \ 11 | \ 12 | -flags +global_header -r 30000/1001 \ 13 | \ 14 | -filter_complex "settb=AVTB,setpts='trunc(PTS/1K)*1K+st(1,trunc(RTCTIME/1K))-1K*trunc(ld(1)/1K)',\ 15 | drawbox=x=0:y=0:width=400:height=100:color=black@0.5:t=fill,\ 16 | drawtext=text='%{localtime\:%M}\:%{localtime\:%S}.%{eif\:1M*t-1K*trunc(t*1K)\:d\:3}':x=15:y=20:\ 17 | fontfile=/usr/share/fonts/truetype/freefont/FreeSans.ttf:fontsize=80:fontcolor=white,\ 18 | split=1[s0];\ 19 | [s0]scale=1280x720[s0]" \ 20 | \ 21 | -pix_fmt yuv420p \ 22 | -c:v libx264 \ 23 | \ 24 | -b:v:0 3000K -maxrate:v:0 3000K -bufsize:v:0 3000K/2 \ 25 | \ 26 | -g:v 30 -keyint_min:v 30 -sc_threshold:v 0 \ 27 | \ 28 | -color_primaries bt709 -color_trc bt709 -colorspace bt709 \ 29 | \ 30 | -c:a aac -ar 48000 -b:a 96k \ 31 | \ 32 | -map [s0] \ 33 | -map 0:a:0 \ 34 | \ 35 | -preset veryfast \ 36 | -tune zerolatency \ 37 | \ 38 | -f flv ${rtmp_url} 39 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Peter Chave 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ffbuilder 2 | A command line builder for FFMPEG 3 | 4 | Simple single web page to help build FFMPEG command lines repeatedly and consistently. 5 | Currently focused around live HLS and DASH stream creation - with particular focus on DASH-LL stream creation. 6 | It also supports RTMP and MPEG-TS over UDP as input and output methods. 7 | 8 | The tool provides a simple interactive way to see how to build up an FFMPEG command. 9 | As you select options on the left, the required command line syntax is added to script on the right. 10 | 11 | The output of the tool is script you can run from either a Linux/Mac shell or as Windows Batch script. 12 | 13 | Page can be run from anywhere, should work in most browsers. Predominately tested in Chrome. 14 | 15 | A hosted version can be found here: https://moctodemo.akamaized.net/tools/ffbuilder/ 16 | 17 | This tool has been used to build and maintain industry reference streams for DASH.js and was recently used by a European public broadcaster to build backup services for their TV and radio channels. 18 | 19 | ![image](https://user-images.githubusercontent.com/16843500/135630604-71ddba11-8dbb-41cd-b4ff-e9fedc252a25.png) 20 | 21 | ## Things on the todo list 22 | 23 | - Build better RTMP input options 24 | - Add HEVC/AV1/etc support 25 | - Enable more ingest server formats -------------------------------------------------------------------------------- /encoder/templates/file-tc-cmaf-6s-sbr-720p24: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | #Generated by command builder r0.3k 4 | 5 | timestamp="$(date +%s)" 6 | 7 | ffmpeg \ 8 | \ 9 | -re -fflags +genpts -stream_loop -1 -i testclip.mp4 \ 10 | \ 11 | -flags +global_header -r 24 \ 12 | \ 13 | -filter_complex "settb=AVTB,setpts='trunc(PTS/1K)*1K+st(1,trunc(RTCTIME/1K))-1K*trunc(ld(1)/1K)',\ 14 | drawbox=x=0:y=0:width=400:height=100:color=black@0.5:t=fill,\ 15 | drawtext=text='%{localtime\:%M}\:%{localtime\:%S}.%{eif\:1M*t-1K*trunc(t*1K)\:d\:3}':x=15:y=20:\ 16 | fontfile=/usr/share/fonts/truetype/freefont/FreeSans.ttf:fontsize=80:fontcolor=white,\ 17 | split=1[s0];\ 18 | [s0]scale=1280x720[s0]" \ 19 | \ 20 | -pix_fmt yuv420p \ 21 | -c:v libx264 \ 22 | \ 23 | -b:v:0 3000K -maxrate:v:0 3000K -bufsize:v:0 3000K/2 \ 24 | \ 25 | -g:v 24 -keyint_min:v 24 -sc_threshold:v 0 \ 26 | \ 27 | -color_primaries bt709 -color_trc bt709 -colorspace bt709 \ 28 | \ 29 | -c:a aac -ar 48000 -b:a 96k \ 30 | \ 31 | -map [s0] \ 32 | -map 0:a:0 \ 33 | \ 34 | -preset veryfast \ 35 | \ 36 | -adaptation_sets 'id=0,seg_duration=6.000,streams=v id=1,seg_duration=6.000,streams=a' \ 37 | -use_timeline 0 \ 38 | -streaming 1 \ 39 | -http_user_agent Akamai_Broadcaster_v1.0 \ 40 | -http_persistent 1 \ 41 | -hls_playlist 1 \ 42 | -media_seg_name $timestamp'/chunk-stream_$RepresentationID$-$Number%05d$.$ext$' \ 43 | -init_seg_name $timestamp'/init-stream_$RepresentationID$.$ext$' \ 44 | -f dash \ 45 | http://p-ep$stream.i.akamaientrypoint.net/cmaf/$stream/$event/out.mpd -------------------------------------------------------------------------------- /encoder/install.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | if [ "$#" -ne 3 ] 3 | then 4 | echo "Usage ./install.sh " 5 | exit 6 | fi 7 | 8 | set -m 9 | 10 | echo Script: $1 11 | echo Media: $2 12 | echo Environment: $3 13 | 14 | # Add repos for ffmpeg, graphics and multimedia 15 | sudo add-apt-repository -y ppa:savoury1/ffmpeg4 16 | sudo add-apt-repository -y ppa:savoury1/graphics 17 | sudo add-apt-repository -y ppa:savoury1/multimedia 18 | sudo apt-get update -qq 19 | 20 | # Install ffmpeg, npm and fonts-freefont-ttf 21 | sudo apt-get -y install ffmpeg npm fonts-freefont-ttf 22 | 23 | # Install PM2 (from npm) 24 | npm install -g pm2 25 | 26 | # Change directory to install location (default /root) 27 | cd /root 28 | 29 | # Download test file to be used by the script (specified as a 2nd parameter) 30 | wget $2 31 | 32 | # Download a script generated by ffmpeg 33 | curl -s "https://$1" > script.sh 34 | chmod +x script.sh 35 | 36 | # Modify the script with user supplied environment variables (like stream id, event name, entrypoint, etc) 37 | sed -i "1 a\ $3" script.sh 38 | 39 | # Run the script within pm2, making it start on boot, restart on failure 40 | 41 | # Install and setup log rotation 42 | pm2 install pm2-logrotate 43 | pm2 set pm2-logrotate:retain 10 44 | # Start script.sh inside pm2 45 | pm2 start -f script.sh 46 | # Save running state of pm2 47 | pm2 save 48 | # Install systemd scripts to manage pm2 49 | pm2 startup -u root 50 | # Kill current pm2 daemon 51 | pm2 kill 52 | # Start daemon using systemd, so it will survive StackScript termination 53 | systemctl start pm2-root 54 | 55 | # Set a cron task to restart the encoder every night at 1am 56 | crontab -l | { cat; echo "0 1 * * * /usr/bin/node /usr/local/bin/pm2 restart all"; } | crontab - 57 | -------------------------------------------------------------------------------- /encoder/templates/file-tc-cmaf-6s-abr-1080p: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | #Generated by command builder r0.3h 4 | #Script expect two variables to be set 'stream' (Stream ID) and 'event' (Event name) 5 | 6 | timestamp="$(date +%s)" 7 | 8 | ffmpeg \ 9 | \ 10 | -re -fflags +genpts -stream_loop -1 -i testclip.mp4 \ 11 | \ 12 | -flags +global_header -r 30000/1001 \ 13 | \ 14 | -filter_complex "split=7[s0][s1][s2][s3][s4][s5][s6];\ 15 | [s0]scale=1920x1080[s0];\ 16 | [s1]scale=1920x1080[s1];\ 17 | [s2]scale=1280x720[s2];\ 18 | [s3]scale=960x540[s3];\ 19 | [s4]scale=768x432[s4];\ 20 | [s5]scale=640x360[s5];\ 21 | [s6]scale=480x270[s6]" \ 22 | \ 23 | -pix_fmt yuv420p \ 24 | -c:v libx264 \ 25 | \ 26 | -b:v:0 6000K -maxrate:v:0 6000K -bufsize:v:0 6000K/2 \ 27 | -b:v:1 4500K -maxrate:v:1 4500K -bufsize:v:1 4500K/2 \ 28 | -b:v:2 3000K -maxrate:v:2 3000K -bufsize:v:2 3000K/2 \ 29 | -b:v:3 2000K -maxrate:v:3 2000K -bufsize:v:3 2000K/2 \ 30 | -b:v:4 1100K -maxrate:v:4 1100K -bufsize:v:4 1100K/2 \ 31 | -b:v:5 730K -maxrate:v:5 730K -bufsize:v:5 730K/2 \ 32 | -b:v:6 365K -maxrate:v:6 365K -bufsize:v:6 365K/2 \ 33 | \ 34 | -g:v 30 -keyint_min:v 30 -sc_threshold:v 0 \ 35 | \ 36 | -color_primaries bt709 -color_trc bt709 -colorspace bt709 \ 37 | \ 38 | -c:a aac -ar 48000 -b:a 96k \ 39 | \ 40 | -map [s0] -map [s1] -map [s2] -map [s3] -map [s4] -map [s5] -map [s6] \ 41 | -map 0:a:0 \ 42 | \ 43 | -preset veryfast \ 44 | \ 45 | -adaptation_sets 'id=0,seg_duration=6.006,streams=v id=1,seg_duration=6.006,streams=a' \ 46 | -use_timeline 0 \ 47 | -streaming 1 \ 48 | -http_user_agent Akamai_Broadcaster_v1.0 \ 49 | -http_persistent 1 \ 50 | -hls_playlist 1 \ 51 | -media_seg_name $timestamp'/chunk-stream_$RepresentationID$-$Number%05d$.$ext$' \ 52 | -init_seg_name $timestamp'/init-stream_$RepresentationID$.$ext$' \ 53 | -f dash \ 54 | http://p-ep$stream.i.akamaientrypoint.net/cmaf/$stream/$event/out.mpd 55 | -------------------------------------------------------------------------------- /encoder/templates/file-tc-dash-ll-2s-720p: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | #Generated by command builder r0.3j 4 | #Script expect two variables to be set 'stream' (Stream ID) and 'event' (Event name) 5 | 6 | timestamp="$(date +%s)" 7 | 8 | ffmpeg \ 9 | \ 10 | -re -fflags +genpts -stream_loop -1 -i testclip.mp4 \ 11 | \ 12 | -flags +global_header -r 30000/1001 \ 13 | \ 14 | -filter_complex "settb=AVTB,\ 15 | setpts='trunc(PTS/1K)*1K+st(1,trunc(RTCTIME/1K))-1K*trunc(ld(1)/1K)',\ 16 | drawbox=x=0:y=0:width=400:height=100:color=black@0.5:t=fill,\ 17 | drawtext=text='%{localtime\:%M}\:%{localtime\:%S}.%{eif\:1M*t-1K*trunc(t*1K)\:d\:3}':x=15:y=20:\ 18 | fontfile=/usr/share/fonts/truetype/freefont/FreeSans.ttf:fontsize=80:fontcolor=white,\ 19 | scale=1280x720" \ 20 | \ 21 | -pix_fmt yuv420p \ 22 | -c:v libx264 \ 23 | \ 24 | -b:v:0 2000K -minrate:v:0 2000K -maxrate:v:0 2000K -bufsize:v:0 2000K/10 \ 25 | \ 26 | -g:v 30 -keyint_min:v 30 -sc_threshold:v 0 \ 27 | \ 28 | -color_primaries bt709 -color_trc bt709 -colorspace bt709 \ 29 | \ 30 | -c:a aac -ar 48000 -b:a 96k \ 31 | \ 32 | -map 0:v:0 \ 33 | -map 0:a:0 \ 34 | \ 35 | -preset veryfast \ 36 | -tune zerolatency \ 37 | -x264-params nal-hrd=cbr \ 38 | \ 39 | -adaptation_sets 'id=0,seg_duration=2.002,streams=v id=1,seg_duration=2.002,streams=a' \ 40 | -use_timeline 0 \ 41 | -streaming 1 \ 42 | -window_size 3 \ 43 | -frag_type every_frame \ 44 | -ldash 1 \ 45 | -utc_timing_url 'https://time.akamai.com?iso&ms' \ 46 | -format_options 'movflags=cmaf' \ 47 | -timeout 0.5 \ 48 | -write_prft 1 \ 49 | -target_latency '3.0' \ 50 | -http_user_agent Akamai_Broadcaster_v1.0 \ 51 | -http_persistent 1 \ 52 | -media_seg_name $timestamp'/chunk-stream_$RepresentationID$-$Number%05d$.$ext$' \ 53 | -init_seg_name $timestamp'/init-stream_$RepresentationID$.$ext$' \ 54 | -f dash \ 55 | http://p-ep$stream.i.akamaientrypoint.net/cmaf/$stream/$event/out.mpd 56 | -------------------------------------------------------------------------------- /encoder/install.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: Install packages for ffmpeg, npm and pm2 3 | hosts: all 4 | tasks: 5 | - name: Add ffmpeg4 repo 6 | become: yes 7 | ansible.builtin.apt_repository: 8 | repo: ppa:savoury1/ffmpeg4 9 | 10 | - name: Add graphics repo 11 | become: yes 12 | ansible.builtin.apt_repository: 13 | repo: ppa:savoury1/graphics 14 | 15 | - name: Add multimedia repo 16 | become: yes 17 | ansible.builtin.apt_repository: 18 | repo: ppa:savoury1/multimedia 19 | 20 | - name: Update repositories cache and install ffmpeg, npm and fonts-freefont-ttf 21 | become: yes 22 | apt: 23 | pkg: 24 | - ffmpeg 25 | - npm 26 | - fonts-freefont-ttf 27 | update_cache: yes 28 | 29 | - name: Install pm2 node.js package globally. 30 | become: yes 31 | community.general.npm: 32 | name: pm2 33 | global: yes 34 | 35 | - name: Fetch media used as input to encoder 36 | ansible.builtin.shell: "wget {{ media }}" 37 | 38 | - name: Fetch script to run encoder 39 | ansible.builtin.shell: "curl -s {{ script }} > script.sh" 40 | 41 | - name: Make script executable 42 | ansible.builtin.shell: "chmod +x script.sh" 43 | 44 | - name: Start script with pm2 45 | ansible.builtin.shell: "pm2 start -f script.sh" 46 | 47 | - name: Save pm2 state 48 | ansible.builtin.shell: "pm2 save" 49 | 50 | - name: Write startup script 51 | ansible.builtin.shell: "pm2 startup | tail -n 1 > startup.sh" 52 | 53 | - name: Make startup script executable 54 | ansible.builtin.shell: "chmod +x startup.sh" 55 | 56 | - name: Run startup script 57 | ansible.builtin.shell: "./startup.sh" 58 | 59 | - name: Enable log rotation 60 | ansible.builtin.shell: "pm2 install pm2-logrotate" 61 | 62 | - name: Limit logs last 10 files 63 | ansible.builtin.shell: "pm2 set pm2-logrotate:retain 10" 64 | 65 | - name: Create job to restart pm2 at 1am nightly 66 | ansible.builtin.cron: 67 | name: "restart nightly at 1am" 68 | minute: "0" 69 | hour: "1" 70 | job: "/usr/bin/node /usr/local/bin/pm2 restart all" 71 | -------------------------------------------------------------------------------- /encoder/templates/file-tc-dash-ll-2s-abr-1080p: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | #Generated by command builder r0.3h 4 | #Script expects two variables to be set 'stream' (Stream ID) and 'event' (Event name) 5 | 6 | timestamp="$(date +%s)" 7 | 8 | ffmpeg \ 9 | \ 10 | -re -fflags +genpts -stream_loop -1 -i testclip.mp4 \ 11 | \ 12 | -flags +global_header -r 30000/1001 \ 13 | \ 14 | -filter_complex "settb=AVTB,\ 15 | setpts='trunc(PTS/1K)*1K+st(1,trunc(RTCTIME/1K))-1K*trunc(ld(1)/1K)',\ 16 | drawbox=x=0:y=0:width=400:height=100:color=black@0.5:t=fill,\ 17 | drawtext=text='%{localtime\:%M}\:%{localtime\:%S}.%{eif\:1M*t-1K*trunc(t*1K)\:d\:3}':x=15:y=20:\ 18 | fontfile=/usr/share/fonts/truetype/freefont/FreeSans.ttf:fontsize=80:fontcolor=white,\ 19 | drawbox=x=1460:y=0:width=460:height=100:color=black@0.5:t=fill,\ 20 | split=7[s0][s1][s2][s3][s4][s5][s6];\ 21 | [s0]drawtext=text='1080p-6.0M':x=1480:y=20:\ 22 | fontfile=/usr/share/fonts/truetype/freefont/FreeSans.ttf:fontsize=80:fontcolor=white,\ 23 | scale=1920x1080[s0];\ 24 | [s1]drawtext=text='1080p-4.5M':x=1480:y=20:\ 25 | fontfile=/usr/share/fonts/truetype/freefont/FreeSans.ttf:fontsize=80:fontcolor=white,\ 26 | scale=1920x1080[s1];\ 27 | [s2]drawtext=text='720p-3.0M':x=1480:y=20:\ 28 | fontfile=/usr/share/fonts/truetype/freefont/FreeSans.ttf:fontsize=80:fontcolor=white,\ 29 | scale=1280x720[s2];\ 30 | [s3]drawtext=text='540p-2.0M':x=1480:y=20:\ 31 | fontfile=/usr/share/fonts/truetype/freefont/FreeSans.ttf:fontsize=80:fontcolor=white,\ 32 | scale=960x540[s3];\ 33 | [s4]drawtext=text='432p-1.1M':x=1480:y=20:\ 34 | fontfile=/usr/share/fonts/truetype/freefont/FreeSans.ttf:fontsize=80:fontcolor=white,\ 35 | scale=768x432[s4];\ 36 | [s5]drawtext=text='360p-0.7M':x=1480:y=20:\ 37 | fontfile=/usr/share/fonts/truetype/freefont/FreeSans.ttf:fontsize=80:fontcolor=white,\ 38 | scale=640x360[s5];\ 39 | [s6]drawtext=text='270p-0.4M':x=1480:y=20:\ 40 | fontfile=/usr/share/fonts/truetype/freefont/FreeSans.ttf:fontsize=80:fontcolor=white,\ 41 | scale=480x270[s6]" \ 42 | \ 43 | -pix_fmt yuv420p \ 44 | -c:v libx264 \ 45 | \ 46 | -b:v:0 6000K -maxrate:v:0 6000K -bufsize:v:0 6000K/2 \ 47 | -b:v:1 4500K -maxrate:v:1 4500K -bufsize:v:1 4500K/2 \ 48 | -b:v:2 3000K -maxrate:v:2 3000K -bufsize:v:2 3000K/2 \ 49 | -b:v:3 2000K -maxrate:v:3 2000K -bufsize:v:3 2000K/2 \ 50 | -b:v:4 1100K -maxrate:v:4 1100K -bufsize:v:4 1100K/2 \ 51 | -b:v:5 730K -maxrate:v:5 730K -bufsize:v:5 730K/2 \ 52 | -b:v:6 365K -maxrate:v:6 365K -bufsize:v:6 365K/2 \ 53 | \ 54 | -g:v 30 -keyint_min:v 30 -sc_threshold:v 0 \ 55 | \ 56 | -color_primaries bt709 -color_trc bt709 -colorspace bt709 \ 57 | \ 58 | -c:a aac -ar 48000 -b:a 96k \ 59 | \ 60 | -map [s0] -map [s1] -map [s2] -map [s3] -map [s4] -map [s5] -map [s6] \ 61 | -map 0:a:0 \ 62 | \ 63 | -preset ultrafast \ 64 | \ 65 | -adaptation_sets 'id=0,seg_duration=2.002,streams=v id=1,seg_duration=2.002,streams=a' \ 66 | -use_timeline 0 \ 67 | -streaming 1 \ 68 | -window_size 15 \ 69 | -frag_type every_frame \ 70 | -ldash 1 \ 71 | -utc_timing_url 'https://time.akamai.com?iso&ms' \ 72 | -format_options 'movflags=cmaf' \ 73 | -write_prft 1 \ 74 | -target_latency '3.0' \ 75 | -timeout 0.5 \ 76 | -http_user_agent Akamai_Broadcaster_v1.0 \ 77 | -http_persistent 1 \ 78 | -media_seg_name $timestamp'/chunk-stream_$RepresentationID$-$Number%05d$.$ext$' \ 79 | -init_seg_name $timestamp'/init-stream_$RepresentationID$.$ext$' \ 80 | -f dash \ 81 | http://p-ep$stream.i.akamaientrypoint.net/cmaf/$stream/$event/out.mpd 82 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | FFMPEG command builder 6 | 38 | 39 | 40 | 861 | 862 | 863 | 864 | 865 |

FFMPEG command line builder

866 | 867 | Release notes Github 868 | 874 | 875 | 876 |
877 |
878 | 879 | 880 |
881 |

Input

882 | 883 | 898 | 901 | 902 | 903 | 915 | 916 |
884 | 897 | 899 |
900 |
Framerate 904 | 914 |
917 | 918 |
919 | 920 | 921 | 922 |
923 |

Filters

924 | 1006 | 1007 | 1008 |
925 | 926 | 927 | 928 |
929 | 930 | 931 | 932 |
933 | 934 |
935 | 936 | 937 | 939 | 940 | 942 | 943 | 945 | 946 | 948 | 949 | 950 | 951 | 952 | 953 | 954 | 955 | 956 | 957 | 958 |
Banner position (x,y) , 938 |
Banner size (w,h) , 941 |
Banner color @ 944 |
Text position (x,y) , 947 |
Text font
Text size
Text color
Timecode
Text
959 |
960 | 961 | 962 | 963 |
964 | 965 |
966 | 967 | 968 | 970 | 971 | 973 | 974 | 976 | 977 | 979 | 980 | 981 | 982 | 983 | 984 | 985 |
Banner position (x,y) , 969 |
Banner size (w,h) , 972 |
Banner color @ 975 |
Text position (x,y) , 978 |
Text font
Text size
Text color
986 |
987 | 988 | 989 | 1004 | 1005 |
1009 | 1010 |
1011 | 1012 | 1013 |
1014 |

Encoding presets

1015 | 1016 | 1028 |
1017 | 1026 | 1027 |
1029 |
1030 | 1031 | 1032 | 1033 |
1034 |

Video encodes

1035 |
1036 |
1037 | 1038 | 1039 | 1045 | 1054 |
Mode 1040 | 1044 |
1055 | 1056 |
1057 | 1058 |

Audio encode

1059 |
1060 | 1067 | 1072 |
1073 | 1074 | 1075 |
1076 |

Optimize

1077 | 1078 | 1085 | 1091 |
Encoding 1079 | 1084 |
Segment size 1086 | 1090 |
1092 | 1093 |
1094 | 1095 | 1096 |
1097 |

Outputs

1098 |

Live streaming

1099 | 1100 | 1101 |
1102 | 1103 |
1104 | 1105 | 1106 | 1112 | 1113 | 1114 | 1115 | 1116 |
Packaging 1111 |
EP type
Stream ID
Event name
Entrypoint
1117 |
1118 | 1119 | 1120 | 1121 |
1122 | 1123 |
1124 | 1125 | 1126 | 1132 | 1133 | 1137 | 1138 | 1139 | 1140 | 1141 |
Packaging 1131 |
HLS optionsPDT 1134 | Independent 1135 | Delete 1136 |
EP type
Stream ID
Event name
Entrypoint
1142 |
1143 | 1144 | 1145 | 1146 | 1147 |
1148 |
1149 | 1150 | 1151 | 1152 | 1153 | 1154 | 1155 | 1157 | 1158 |
EP type
Stream ID
Stream key
Use auth
Credentials 1156 | :
Entrypoint
1159 | 1160 |
1161 | 1162 | 1163 | 1164 | 1165 |
1166 | 1167 | 1168 | 1169 |
1170 |
1171 | 1172 | 1174 | 1175 | 1187 | 1188 |
1189 | 1190 |
1191 |
1192 |
1193 |

Script

1194 | 1195 |
1196 |
1197 | 1198 | 1199 | 1205 | 1206 | 1209 | 1210 | 1211 |
Script format 1200 | 1204 |     1207 | 1208 |
1212 |
1213 | 1214 | 1215 | 1216 |
1217 |
1218 | 1219 | 1220 | --------------------------------------------------------------------------------