mirror of
https://github.com/mpv-player/mpv
synced 2024-12-18 12:55:16 +00:00
6c8362ef54
The main change is that we wait with opening the muxer ("writing headers") until we have data from all streams. This fixes race conditions at init due to broken assumptions in the old code. This also changes a lot of other stuff. I found and fixed a few API violations (often things for which better mechanisms were invented, and the old ones are not valid anymore). I try to get away from the public mutex and shared fields in encode_lavc_context. For now it's still needed for some timestamp-related fields, but most are gone. It also removes some bad code duplication between audio and video paths.
234 lines
7.9 KiB
Plaintext
234 lines
7.9 KiB
Plaintext
#
|
|
# 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 --ofps=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
|
|
ocopyts = yes
|
|
profile = enc-v-h263
|
|
profile = enc-a-aac
|
|
ofopts = ""
|
|
|
|
[enc-f-avi]
|
|
profile-desc = "MPEG-4 + MP3 (for AVI)"
|
|
of = avi
|
|
ocopyts = no
|
|
oautofps = yes
|
|
profile = enc-v-mpeg4
|
|
profile = enc-a-mp3
|
|
ofopts = ""
|
|
|
|
[enc-f-mp4]
|
|
profile-desc = "H.264 + AAC (for MP4)"
|
|
of = mp4
|
|
ocopyts = yes
|
|
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
|
|
ocopyts = yes
|
|
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
|
|
ofps = 25
|
|
oharddup = yes
|
|
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
|
|
ofps = 24000/1001
|
|
oharddup = yes
|
|
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
|
|
omaxfps = 30
|
|
|
|
[enc-to-nok-6300]
|
|
profile-desc = "3GP for Nokia 6300"
|
|
profile = enc-f-3gp
|
|
ofps = 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
|
|
omaxfps = 30
|
|
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"
|