summaryrefslogtreecommitdiffstats
path: root/etc/encoding-profiles.conf
blob: 77a0d91b8f073e2afb7fdede4c9c23617410e73e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
#
# mpv configuration file
#

#########################
# encoding profile file #
#########################
#
# Note: by default, this file is installed to /etc/mpv/encoding-profiles.conf
# (or a different location, depending on --prefix). mpv will load it by
# default on program start. If ~/.mpv/encoding-profiles.conf exists, this file
# will be loaded instead.
#
# Then, list all profiles by
#   mpv --profile=help | grep enc-
#
# The following kinds of encoding profiles exist:
#   enc-a-*:  initialize an audio codec including good defaults
#   enc-v-*:  initialize a video codec including good defaults
#   enc-f-*:  initialize a file format including good defaults, including
#             selecting and initializing a good audio and video codec
#   enc-to-*: load known good settings for a target device; this typically
#             includes selecting an enc-f-* profile, then adjusting some
#             settings like frame rate, resolution and codec parameters
#
# AFTER including a profile of these, you can of course still change
# options, or even switch to another codec.
#
# You can view the exact options a profile sets by
#   mpv --show-profile=enc-to-hp-slate-7
#
# Examples:
#   mpv --profile=enc-to-dvdpal --o=outfile.mpg infile.mkv
#   mpv --profile=enc-f-avi --vf=fps=30 --o=outfile.avi infile.mkv
#   mpv --profile=enc-v-mpeg4 --ovcopts-add=qscale=7 --profile=enc-a-mp3 --oacopts-add=b=320k --o=outfile.avi infile.mkv

################
# audio codecs #
################
[enc-a-aac]
profile-desc = "AAC (libfdk-aac or FFmpeg)"
oac = libfdk_aac,aac
oacopts = b=96k

[enc-a-ac3]
profile-desc = "AC3 (FFmpeg)"
oac = ac3
oacopts = b=448k

[enc-a-mp3]
profile-desc = "MP3 (LAME)"
oac = libmp3lame
oacopts = b=128k

[enc-a-vorbis]
profile-desc = "Vorbis (libvorbis or FFmpeg)"
oac = libvorbis,vorbis
oacopts = qscale=3

[enc-a-opus]
profile-desc = "Opus (libopus or FFmpeg)"
oac = libopus,opus
audio-samplerate = 48000
oacopts = b=96k

################
# video codecs #
################
[enc-v-h263]
profile-desc = "H.263 (FFmpeg)"
ovc = h263
ovcopts = qscale=4

[enc-v-h264]
profile-desc = "H.264 (x264)"
ovc = libx264
ovcopts = preset=medium,crf=23,threads=0
# If you want to restrict the output video to something compatible with most
# hardware and basic decoders, add "profile=high,level=41" to ovcopts above and
# uncomment the following line to avoid errors when source video isn't yuv420p:
#vf-add = format=yuv420p

[enc-v-mpeg2]
profile-desc = "MPEG-2 Video (FFmpeg)"
ovc = mpeg2video

[enc-v-mpeg4]
profile-desc = "MPEG-4 Part 2 (FFmpeg)"
ovc = mpeg4
ovcopts = qscale=4

[enc-v-vp8]
profile-desc = "VP8 (libvpx)"
ovc = libvpx
ovcopts = speed=0,lag-in-frames=8,slices=2,threads=0,b=2M,crf=10,qmin=0,qmax=36

[enc-v-vp9]
profile-desc = "VP9 (libvpx)"
ovc = libvpx-vp9
ovcopts = speed=6,lag-in-frames=8,slices=2,threads=0,crf=18,qmin=0,qmax=36

###########
# formats #
###########
[enc-f-3gp]
profile-desc = "H.263 + AAC (for 3GP)"
of = 3gp
profile = enc-v-h263
profile = enc-a-aac
ofopts = ""

[enc-f-avi]
profile-desc = "MPEG-4 + MP3 (for AVI)"
of = avi
profile = enc-v-mpeg4
profile = enc-a-mp3
ofopts = ""

[enc-f-mp4]
profile-desc = "H.264 + AAC (for MP4)"
of = mp4
profile = enc-v-h264
profile = enc-a-aac
## equivalent to using qt-faststart tool
## can be used to speed up seeking when streaming
# ofopts = movflags=+faststart

[enc-f-webm]
profile-desc = "VP9 + Opus (for WebM)"
of = webm
profile = enc-v-vp9
profile = enc-a-opus
ofopts = ""

##################
# target devices #
##################
[enc-to-dvdpal]
profile-desc = "DVD-Video PAL, use dvdauthor -v pal -a ac3+en (MUST be used with 4:3 or 16:9 aspect, and 720x576, 704x576, 352x576 or 352x288 resolution)"
profile = enc-v-mpeg2
profile = enc-a-ac3
of = dvd
ofopts-append = packetsize=2048
ofopts-append = muxrate=10080000
vf-add = fps=25
audio-samplerate = 48000
ovcopts = g=15,b=6000000,maxrate=9000000,minrate=0,bufsize=1835008

[enc-to-dvdntsc]
profile-desc = "DVD-Video NTSC, use dvdauthor -v ntsc -a ac3+en (MUST be used with 4:3 or 16:9 aspect, and 720x480, 704x480, 352x480 or 352x240 resolution)"
profile = enc-v-mpeg2
profile = enc-a-ac3
of = dvd
ofopts-append = packetsize=2048
ofopts-append = muxrate=10080000
vf-add = fps="24000/1001"
audio-samplerate = 48000
ovcopts = g=18,b=6000000,maxrate=9000000,minrate=0,bufsize=1835008

[enc-to-nok-n900]
profile-desc = "MP4 for Nokia N900"
profile = enc-f-mp4
# DW = 800, DH = 480, SAR = 1
vf-add = lavfi=graph="scale=floor(min(min(800\,dar*480)\,in_w*max(1\,sar))/2+0.5)*2:floor(min(min(800/dar\,480)\,in_h*max(1/sar\,1))/2+0.5)*2,setsar=sar=1"
ovcopts-append = profile=baseline
ovcopts-append = level=30
ovcopts-append = maxrate=10000k
ovcopts-append = bufsize=10000k
ovcopts-append = rc_init_occupancy=9000k
ovcopts-append = refs=5

[enc-to-nok-6300]
profile-desc = "3GP for Nokia 6300"
profile = enc-f-3gp
vf-add = fps=25
vf-add = lavfi=graph="scale=176:144"
audio-samplerate = 16000
audio-channels = 1
oacopts-add = b=32k

[enc-to-hp-slate-7]
profile-desc = "MP4 for HP Slate 7 (1024x600, crazy aspect)"
profile = enc-f-mp4
ovcopts-add = profile=high
# DW = 1024, DH = 600, DAR = 97:54 (=> SAR = 2425:2304)
vf-add = lavfi=graph="scale=floor(min(1024*min(1\,dar/(97/54))\,in_w)/2+0.5)*2:floor(min(600*min((97/54)/dar\,1)\,in_h)/2+0.5)*2,setsar=sar=sar/(2425/2304)"

# Advanced scaling for specific output devices - how it works:
# DW = display width (px) (1024)
# DH = display height (px) (600)
# SAR = display sample aspect ratio, i.e. DAR * DH / DW (2425:2304)
# DAR = display aspect ratio, i.e. SAR * DW / DH (97:54)
# Variant: zoomed out
# vf-add = lavfi=graph="scale=floor(min(DW*min(1\,dar/DAR)\,in_w*max(1\,sar/SAR))/2+0.5)*2:floor(min(DH*min(DAR/dar\,1)\,in_h*max(SAR/sar\,1))/2+0.5)*2,setsar=sar=1"
# Variant: zoomed in
# vf-add = lavfi=graph="scale=floor(min(DW*max(1\,dar/DAR)\,in_w*max(1\,sar/SAR))/2+0.5)*2:floor(min(DH*max(DAR/dar\,1)\,in_h*max(SAR/sar\,1))/2+0.5)*2,setsar=sar=1"
# How it works:
# 1a: DW, DH*dar/DAR - fit to display width
# 1b: DH*DAR/dar, DH - fit to display height
# 1: the min of 1a and 1b these (i.e. fit inside both width and height); for zoomed in view, use the max
# 2a: in_w, in_h*SAR/sar - fit to original width
# 2b: in_w*sar/SAR, in_h - fit to original height
# 2: the max of 2a and 2b (i.e. avoid enlarging both dimensions - let HW scaling handle this)
# output: the min of 1 and 2 (i.e. fulfill both constraints)
# setsar=sar=1 to prevent scaling on the device (skip this if the device actually wants the proper SAR to be specified for not performing needless scaling)
#
# Simplified special case for SAR == 1, DAR == DW/DH:
# Variant: zoomed out
# vf-add = lavfi=graph="scale=floor(min(min(DW\,dar*DH)\,in_w*max(1\,sar))/2+0.5)*2:floor(min(min(DW/dar\,DH)\,in_h*max(1/sar\,1))/2+0.5)*2,setsar=sar=1"
# Variant: zoomed in
# vf-add = lavfi=graph="scale=floor(min(max(DW\,dar*DH)\,in_w*max(1\,sar))/2+0.5)*2:floor(min(max(DW/dar\,DH)\,in_h*max(1/sar\,1))/2+0.5)*2,setsar=sar=1"
# setsar=sar=1 to prevent nasty almost-1 SAR to be passed to the codec due to the rounding which can fail
#
# If the device supports file SAR properly, we can make use of it to avoid
# upscaling. The setsar=sar=sar/SAR at the end serves to fake the SAR for devices that don't know their own display's SAR.
# Variant: zoomed out
# vf-add = lavfi=graph="scale=floor(min(DW*min(1\,dar/DAR)\,in_w)/2+0.5)*2:floor(min(DH*min(DAR/dar\,1)\,in_h)/2+0.5)*2,setsar=sar=sar/SAR"
# Variant: zoomed in
# vf-add = lavfi=graph="scale=floor(min(DW*max(1\,dar/DAR)\,in_w)/2+0.5)*2:floor(min(DH*max(DAR/dar\,1)\,in_h)/2+0.5)*2,setsar=sar=sar/SAR"
# Simplified special case for SAR == 1, DAR == DW/DH:
# Variant: zoomed out
# vf-add = lavfi=graph="scale=floor(min(min(DW\,dar*DH)\,in_w)/2+0.5)*2:floor(min(min(DW/dar\,DH)\,in_h)/2+0.5)*2"
# Variant: zoomed in
# vf-add = lavfi=graph="scale=floor(min(max(DW\,dar*DH)\,in_w)/2+0.5)*2:floor(min(max(DW/dar\,DH)\,in_h)/2+0.5)*2"