hello friends! new(ish)!
WebM: Difference between revisions
>Fufulord |
>Hentaiotoko (Added and expanded upon options. Updated for VP9. Covered VP9 seeking issue and solution. Added 2-pass encoding explanation.) |
||
Line 34: | Line 34: | ||
Below is an ffmpeg command: | Below is an ffmpeg command: | ||
ffmpeg -i input.mp4 -c:v libvpx -b:v 1M -c:a libvorbis output.webm | ffmpeg -i input.mp4 -c:v libvpx-vp9 -b:v 1M -c:a libvorbis output.webm | ||
This may look intimidating but it is not all that bad. Let's look at the different parameters: | This may look intimidating but it is not all that bad. Let's look at the different parameters: | ||
* '''-i''': Specifies the input file, which you're converting to another format. | * '''-i''': Specifies the input file, which you're converting to another format. | ||
* '''-c:v''' Specifies the video codec to use. webm isn't actually an encoding type unto itself, but an audio/video container, like mkv. Nevertheless, you will almost always use ''libvpx'' for the video. | * '''-c:v''' Specifies the video codec to use. webm isn't actually an encoding type unto itself, but an audio/video container, like mkv. <s>Nevertheless, you will almost always use ''libvpx'' for the video.</s> VP8 has been succeeded by VP9. In order to utilise it, you must use "libvpx-vp9", as "libvpx" will use VP8 instead. | ||
* '''-b''': Sets the target bitrate. '''-b:v''' sets video bitrate and '''-b:a''' sets audio. Only use this option if you desire a constant bitrate, which will produce a higher quality file. If you are looking for a smaller file size, consider leaving this out. | * '''-b''': Sets the target bitrate. '''-b:v''' sets video bitrate and '''-b:a''' sets audio. Only use this option if you desire a constant bitrate, which will produce a higher quality file. If you are looking for a smaller file size, consider leaving this out. | ||
* '''-c:a''': Specifies the audio codec to use. Some options include libvorbis, libmp3lame, etc. If you are unsure stick with libvorbis. | * '''-c:a''': Specifies the audio codec to use. Some options include libvorbis, libmp3lame, etc. If you are unsure stick with libvorbis. As libopus is capable of lower filesizes at very low bitrates, if you are using an audio bitrate of, for example, 64K, you may consider using libopus instead of libvorbis. | ||
Other | Other useful options: | ||
* '''-threads''': Tells ffmpeg to use multithreading. Enter the number of cores your processor has as a parameter or put 0 to use them all. | * '''-threads''': Tells ffmpeg to use multithreading, speeding up the encoding process. Enter the number of cores your processor has -1 as a parameter (for quadcore, use -threads 3) <s>or put 0 to use them all</s>. VP8 and VP9 cannot auto-detect the amount of cores your processor has, so using -threads 0 is equivalent to using -threads 1. Be aware that using multithreading may slightly lower output quality and have the effect that repeat encodes do not have identical results. | ||
* '''-ac''': Sets number of audio channels, normally 2 or 1. Sometimes setting to 1 will give you a smaller filesize. You should probably not touch this unless you know what you're doing. | * '''-ac''': Sets number of audio channels, normally 2 or 1. Sometimes setting to 1 will give you a smaller filesize. You should probably not touch this unless you know what you're doing. | ||
* '''-an''': Disable audio. Use when converting .gif files to .webm. | * '''-an''': Disable audio. Use when converting .gif files to .webm. | ||
* '''- | * '''-sn''': Disable subtitles. | ||
* '''-ss''': Seeks to a position in the file. Useful for cutting out small scenes. Takes time in seconds as a parameter or HH:MM:SS syntax. use '''-t''' in tandem to set the file duration. For example, <code>-t 00:00:10 </code> cuts out the first ten seconds of the video for conversion, and <code>-ss 00:00:10 -t 00:00:10</code> would skip the first ten seconds and cut out the next ten for conversion. | * '''-ss''': Seeks to a position in the file. Useful for cutting out small scenes. Takes time in seconds as a parameter or HH:MM:SS syntax. use '''-t''' in tandem to set the file duration. For example, <code>-t 00:00:10 </code> cuts out the first ten seconds of the video for conversion, and <code>-ss 00:00:10 -t 00:00:10</code> would skip the first ten seconds and cut out the next ten for conversion. | ||
* '''-speed''': Controls the speed at which the video is encoded. Faster speeds come at the expense of lower quality and larger filesizes. Use -speed 0 for maximum quality and lowest filesizes. | |||
* '''-qmin''' and '''-qmax''': Tells ffmpeg what "quantization parameter" to use when assigning quality. Don't worry if you don't know what a quantization parameter is, because neither do I. All I know is that lower numbers = better quality. I believe the -qmax option prevents the quality from dropping below a certain level for any given frame, so the overall video quality will be more consistent (it prevents you from getting certain frames in your video which are of absolutely dreadful quality where everything is blocky as fuck, basically). Recommended values: -qmin 0 -qmax 50 | |||
* '''-crf''': Sets CRF value. Must be from 4-63 in VP8, or 0-63 in VP9. Lower is higher quality. 10 the recommended setting. There are two ways of using CRF - 1) "Constant Quality" mode, 2) "Constrained Quality" mode. | |||
**1) To use constant quality mode, you MUST use a value of "0" when specifying the video bitrate (-b:v 0). If you just remove the "-b:v" option altogether, ffmpeg will simply fall back on the default bitrate (256K, I think), which will result in a constrained quality encode with extremely poor quality. Constant quality mode tries to achieve a... well... constant level of quality, using whatever bitrate is necessary to achieve that level of quality. This will result in very large file sizes, so is not suitable for making webms intended for imageboards which typically have a file size limit of 10MB or less. Example command: <code>ffmpeg -i input.mp4 -c:v libvpx-vp9 -crf 10 -b:v 0 -c:a libvorbis output.webm</code> | |||
**2) To use constrained quality mode, you must specify both a CRF value (e.g. -crf 10) AND a video bitrate value (e.g. -b:v 1M). Constrained quality mode will try to achieve a certain level of quality, but without going over a specified bitrate level. When -b:v is used without -crf, the value of -b:v is a ''target'' bitrate, but when -b:v and -crf are used together, -b:v becomes a ''maximum'' bitrate. This is a way of achieving high quality while still retaining control over the filesize. Ideally it should be used with the 2-pass encoding method. Example command: <code>ffmpeg -i input.mp4 -c:v libvpx-vp9 -crf 10 -b:v 1M -c:a libvorbis output.webm</code> | |||
To simply print metadata about a video file: <code>ffmpeg -i input_file -f ffmetadata metadata.txt</code> | |||
==== Seeking issue with VP9 ==== | |||
VP9 currently has a stupid default value (9999) for the maximum interval between keyframes, which can cause seeking issues during playback: | |||
*Trying to navigate forwards through the video using the arrow keys on your keyboard causes the audio to skip ahead but the video to freeze. | |||
*Trying to navigate backwards causes the video to skip right back to the first frame. | |||
*Precise seeking using mouse clicks is very slow; after clicking somewhere on the progress bar, there will be a delay of several seconds before the video actually skips to that point. | |||
If you encounter this problem, it is easily fixed with the -g option. The default value in VP8 for this option was 128, so just use that ("-g 128"). | |||
==== 2-pass encoding ==== | |||
You may utilise the 2-pass encoding method in order to increase the quality of your video, at the expense of making the encoding process a little longer. During 2-pass encoding, you will make one "pass" through the video where the encoder simply collects information about the video you want to make a webm from, and then a second "pass" where you encode the video for real utilising the information collected during the first "pass". The advantage of this is that the encoder knows what to expect when encoding the video and doesn't have to guess whether the next frame is going to be a difficult frame or not depending on how difficult the previous frames were. This results in a better allocation of bits, and thus better quality. | |||
Here is an example: | |||
*First pass: <code>ffmpeg -i input.mp4 -c:v libvpx-vp9 -pass 1 -qmin 0 -qmax 50 -crf 10 -b:v 1M -threads 1 -tile-columns 0 -speed 4 -g 128 -aq-mode 0 -an -sn -f webm /dev/null</code> | |||
*Second pass: <code>ffmpeg -i input.mp4 -c:v libvpx-vp9 -pass 2 -qmin 0 -qmax 50 -crf 10 -b:v 1M -c:a libopus -b:a 64K -vbr on -threads 1 -tile-columns 0 -speed 0 -auto-alt-ref 1 -lag-in-frames 25 -g 128 -aq-mode 0 -sn -f webm output.webm</code> | |||
==== Operations with -vf ==== | ==== Operations with -vf ==== | ||
Line 57: | Line 76: | ||
The '''-vf''' flag allows you to define 'filters' which can help you further manipulate the file. The syntax for this looks something like <code>-vf \<filter\<=\<param\></code>. Use <code>ffmpeg -filters</code> to get a list of filters and how to use them. Some of the more common ones will be explored below. | The '''-vf''' flag allows you to define 'filters' which can help you further manipulate the file. The syntax for this looks something like <code>-vf \<filter\<=\<param\></code>. Use <code>ffmpeg -filters</code> to get a list of filters and how to use them. Some of the more common ones will be explored below. | ||
* '''scale''': Scale takes two arguments separated by a colon, which are width and height respectively. If you enter -1 for either variable, ffmpeg will scale the video based off of the aspect ratio of the source file. An example of this would be <code>-vf scale=640:-1</code> | * '''scale''': Scale takes two arguments separated by a colon, which are width and height respectively. If you enter -1 for either variable, ffmpeg will scale the video based off of the aspect ratio of the source file. An example of this would be <code>-vf scale=640:-1</code>, though it is preferable to use -2 which will ensure that the resolution is divisible by 2. | ||
=== Premade Scripts === | === Premade Scripts === | ||
Line 168: | Line 187: | ||
#http://wiki.webmproject.org/ffmpeg | #http://wiki.webmproject.org/ffmpeg | ||
#N0Lif3's Windows tutorial: https://www.youtube.com/watch?v=WeM3SUp-HRg | #N0Lif3's Windows tutorial: https://www.youtube.com/watch?v=WeM3SUp-HRg | ||
#http://wiki.webmproject.org/ffmpeg/vp9-encoding-guide | |||
#https://github.com/Kagami/webm.py/wiki/Notes-on-encoding-settings | |||
#https://trac.ffmpeg.org/wiki/Encode/VP8 | |||
#https://trac.ffmpeg.org/wiki/Encode/VP9 | |||
#http://forum.doom9.org/showthread.php?t=168947 | |||
#http://slhck.info/video-encoding | |||
[[Category:Software]] | [[Category:Software]] | ||
[[Category:HowTo]] | [[Category:HowTo]] |
Revision as of 10:11, 29 March 2016
WebM support is the newest addition to 4chan (as of April 6th, 2014). WebM is an open, royalty-free, media file format designed for the web.
WebM defines the file container structure, video and audio formats. WebM files consist of video streams compressed with the VP8 video codec and audio streams compressed with the Vorbis audio codec. The WebM file structure is based on the Matroska container.
This wiki page is meant to serve as an instructional tool to help you get started converting your content to WebM for posting.
General Info
List of Stickies / Test Threads
- https://rbt.asia/g/thread/S41184007
- https://rbt.asia/g/thread/S41183707
- https://rbt.asia/g/thread/S41178861
- https://rbt.asia/g/thread/S41190521
- https://rbt.asia/g/thread/S41212767#p41212767
Limitations
Current limits for WebM files on 4chan are:
- Maximum file size is 4096KB.
- Maximum duration is 300 seconds (5 minutes).
- Maximum resolution is 2048x2048 pixels.
- No audio streams except on /gif/ and /wsg/. (use -an)
Current limits for WebM files on 8chan are:
- Maximum file size is 8192KB.
- Maximum resolution is 10000x10000 pixels.
- Audio streams permitted globally.
Converting with ffmpeg
Note: avconv and ffmpeg are not entirely drop-in replacements. Make sure you know which one you are using.
OS X Users: The homebrew version of ffmpeg doesn't include webm support by default, try brew install ffmpeg --with-libvpx.
Command Line Options
Below is an ffmpeg command:
ffmpeg -i input.mp4 -c:v libvpx-vp9 -b:v 1M -c:a libvorbis output.webm
This may look intimidating but it is not all that bad. Let's look at the different parameters:
- -i: Specifies the input file, which you're converting to another format.
- -c:v Specifies the video codec to use. webm isn't actually an encoding type unto itself, but an audio/video container, like mkv.
Nevertheless, you will almost always use libvpx for the video.VP8 has been succeeded by VP9. In order to utilise it, you must use "libvpx-vp9", as "libvpx" will use VP8 instead. - -b: Sets the target bitrate. -b:v sets video bitrate and -b:a sets audio. Only use this option if you desire a constant bitrate, which will produce a higher quality file. If you are looking for a smaller file size, consider leaving this out.
- -c:a: Specifies the audio codec to use. Some options include libvorbis, libmp3lame, etc. If you are unsure stick with libvorbis. As libopus is capable of lower filesizes at very low bitrates, if you are using an audio bitrate of, for example, 64K, you may consider using libopus instead of libvorbis.
Other useful options:
- -threads: Tells ffmpeg to use multithreading, speeding up the encoding process. Enter the number of cores your processor has -1 as a parameter (for quadcore, use -threads 3)
or put 0 to use them all. VP8 and VP9 cannot auto-detect the amount of cores your processor has, so using -threads 0 is equivalent to using -threads 1. Be aware that using multithreading may slightly lower output quality and have the effect that repeat encodes do not have identical results. - -ac: Sets number of audio channels, normally 2 or 1. Sometimes setting to 1 will give you a smaller filesize. You should probably not touch this unless you know what you're doing.
- -an: Disable audio. Use when converting .gif files to .webm.
- -sn: Disable subtitles.
- -ss: Seeks to a position in the file. Useful for cutting out small scenes. Takes time in seconds as a parameter or HH:MM:SS syntax. use -t in tandem to set the file duration. For example,
-t 00:00:10
cuts out the first ten seconds of the video for conversion, and-ss 00:00:10 -t 00:00:10
would skip the first ten seconds and cut out the next ten for conversion. - -speed: Controls the speed at which the video is encoded. Faster speeds come at the expense of lower quality and larger filesizes. Use -speed 0 for maximum quality and lowest filesizes.
- -qmin and -qmax: Tells ffmpeg what "quantization parameter" to use when assigning quality. Don't worry if you don't know what a quantization parameter is, because neither do I. All I know is that lower numbers = better quality. I believe the -qmax option prevents the quality from dropping below a certain level for any given frame, so the overall video quality will be more consistent (it prevents you from getting certain frames in your video which are of absolutely dreadful quality where everything is blocky as fuck, basically). Recommended values: -qmin 0 -qmax 50
- -crf: Sets CRF value. Must be from 4-63 in VP8, or 0-63 in VP9. Lower is higher quality. 10 the recommended setting. There are two ways of using CRF - 1) "Constant Quality" mode, 2) "Constrained Quality" mode.
- 1) To use constant quality mode, you MUST use a value of "0" when specifying the video bitrate (-b:v 0). If you just remove the "-b:v" option altogether, ffmpeg will simply fall back on the default bitrate (256K, I think), which will result in a constrained quality encode with extremely poor quality. Constant quality mode tries to achieve a... well... constant level of quality, using whatever bitrate is necessary to achieve that level of quality. This will result in very large file sizes, so is not suitable for making webms intended for imageboards which typically have a file size limit of 10MB or less. Example command:
ffmpeg -i input.mp4 -c:v libvpx-vp9 -crf 10 -b:v 0 -c:a libvorbis output.webm
- 2) To use constrained quality mode, you must specify both a CRF value (e.g. -crf 10) AND a video bitrate value (e.g. -b:v 1M). Constrained quality mode will try to achieve a certain level of quality, but without going over a specified bitrate level. When -b:v is used without -crf, the value of -b:v is a target bitrate, but when -b:v and -crf are used together, -b:v becomes a maximum bitrate. This is a way of achieving high quality while still retaining control over the filesize. Ideally it should be used with the 2-pass encoding method. Example command:
ffmpeg -i input.mp4 -c:v libvpx-vp9 -crf 10 -b:v 1M -c:a libvorbis output.webm
- 1) To use constant quality mode, you MUST use a value of "0" when specifying the video bitrate (-b:v 0). If you just remove the "-b:v" option altogether, ffmpeg will simply fall back on the default bitrate (256K, I think), which will result in a constrained quality encode with extremely poor quality. Constant quality mode tries to achieve a... well... constant level of quality, using whatever bitrate is necessary to achieve that level of quality. This will result in very large file sizes, so is not suitable for making webms intended for imageboards which typically have a file size limit of 10MB or less. Example command:
To simply print metadata about a video file: ffmpeg -i input_file -f ffmetadata metadata.txt
Seeking issue with VP9
VP9 currently has a stupid default value (9999) for the maximum interval between keyframes, which can cause seeking issues during playback:
- Trying to navigate forwards through the video using the arrow keys on your keyboard causes the audio to skip ahead but the video to freeze.
- Trying to navigate backwards causes the video to skip right back to the first frame.
- Precise seeking using mouse clicks is very slow; after clicking somewhere on the progress bar, there will be a delay of several seconds before the video actually skips to that point.
If you encounter this problem, it is easily fixed with the -g option. The default value in VP8 for this option was 128, so just use that ("-g 128").
2-pass encoding
You may utilise the 2-pass encoding method in order to increase the quality of your video, at the expense of making the encoding process a little longer. During 2-pass encoding, you will make one "pass" through the video where the encoder simply collects information about the video you want to make a webm from, and then a second "pass" where you encode the video for real utilising the information collected during the first "pass". The advantage of this is that the encoder knows what to expect when encoding the video and doesn't have to guess whether the next frame is going to be a difficult frame or not depending on how difficult the previous frames were. This results in a better allocation of bits, and thus better quality.
Here is an example:
- First pass:
ffmpeg -i input.mp4 -c:v libvpx-vp9 -pass 1 -qmin 0 -qmax 50 -crf 10 -b:v 1M -threads 1 -tile-columns 0 -speed 4 -g 128 -aq-mode 0 -an -sn -f webm /dev/null
- Second pass:
ffmpeg -i input.mp4 -c:v libvpx-vp9 -pass 2 -qmin 0 -qmax 50 -crf 10 -b:v 1M -c:a libopus -b:a 64K -vbr on -threads 1 -tile-columns 0 -speed 0 -auto-alt-ref 1 -lag-in-frames 25 -g 128 -aq-mode 0 -sn -f webm output.webm
Operations with -vf
The -vf flag allows you to define 'filters' which can help you further manipulate the file. The syntax for this looks something like -vf \<filter\<=\<param\>
. Use ffmpeg -filters
to get a list of filters and how to use them. Some of the more common ones will be explored below.
- scale: Scale takes two arguments separated by a colon, which are width and height respectively. If you enter -1 for either variable, ffmpeg will scale the video based off of the aspect ratio of the source file. An example of this would be
-vf scale=640:-1
, though it is preferable to use -2 which will ensure that the resolution is divisible by 2.
Premade Scripts
If you're that lazy, here's a couple premade scripts for video and gif conversion.
Windows
Save these programs as a .bat file and place them in the folder of the video you want to convert.
Video to WebM
@echo off rem about 3megabyte in bit 3*1024*1024*8*0.95 set /A MAXSIZE=23907532 set WIDTH=720 ffmpeg -i %1 2> webm.tmp for /F "tokens=1,2,3,4,5,6 delims=:., " %%i in (webm.tmp) do ( if "%%i"=="Duration" call :calcLength %%j %%k %%l %%m ) del webm.tmp SET /a BITRATE=%MAXSIZE%/%VSECONDS% ffmpeg -y -i %1 -threads 0 -sn -an -c:v libvpx -b:v %BITRATE% -vf scale=-1:%WIDTH% -quality best -cpu-used 0 -slices 8 -auto-alt-ref 1 -f webm -pass 1 NUL ffmpeg -y -i %1 -threads 0 -sn -an -c:v libvpx -b:v %BITRATE% -vf scale=-1:%WIDTH% -quality best -cpu-used 0 -slices 8 -auto-alt-ref 1 -f webm -pass 2 "%~n1.webm" del ffmpeg2pass-0.log > NUL goto :EOF :calcLength FOR /F "tokens=* delims=0" %%A IN ("%3") DO SET /A s=%%A FOR /F "tokens=* delims=0" %%A IN ("%2") DO SET /A s=s+%%A*60 FOR /F "tokens=* delims=0" %%A IN ("%1") DO SET /A s=s+%%A*60*60 set /A VSECONDS=s
gif to webm
@ECHO OFF ffmpeg -y -i "%~1" -b:v 3M -quality best -cpu-used 0 -slices 8 "%~1.webm"
Linux / OS X
If you're using OS X or Linux, you probably know how to save and execute these scripts already, but here's a quick overview:
- Create a file, such as
~/bin/my_script.sh
- Copy and paste the code into this file with your favorite editor.
- Open a shell. Run the command
chmod +x ~/bin/my_script.sh
- The script can now be called as
~/bin/my_script.sh some_file.type
or if you have your PATH set correctly,my_script.sh some_file.type
webm.bash
It does interactive cropping with mplayer, interactive selection of start and end times with mplayer, hardsubs, and has many more options.
https://gist.github.com/interjection/4b83c0790ce82982caec
.gif Convert
#!/bin/bash ffmpeg -i $1 -threads 0 -cpu-used 0 -c:v libvpx -f webm -b:v 700k -quality good -qmin 10 -qmax 42 -an /dev/null ffmpeg -i $1 -threads 0 -cpu-used 0 -c:v libvpx -f webm -b:v 700k -quality good -qmin 10 -qmax 42 -an "$F"
High-End Video Convert
#!/bin/bash # Warning: this script will probably take up a lot of CPU usage. Don't crash your machine. ffmpeg -i $1 -threads 0 -cpu-used 0 -c:v libvpx -c:a libvorbis -ac 2 -qmin 0 -qmax 10 -bufsize 1000k -quality good -crf 4 -b:v 2M -pass 1 /dev/null ffmpeg -i $1 -threads 0 -cpu-used 0 -c:v libvpx -c:a libvorbis -ac 2 -qmin 0 -qmax 10 -bufsize 1000k -quality good -crf 4 -b:v 2M -pass 1 "$1".webm
̈́Split Video
#!/bin/bash # Takes a large video file and splits it into multiple 3MB webm files crf=18 bitrate=500K threads=8 # Duration of original video in seconds duration=$(expr `mediainfo --Inform="General;%Duration%" "$1"` / 1000) sec=0 j=1 until (($sec >= $duration)) do ffmpeg -ss $sec -i "$1" -an -sn -threads $threads -c:v libvpx -crf $crf -b:v $bitrate -fs 3M $j.webm # Duration of previous video is added to the sum of every previous video sec=$(expr $(expr `mediainfo --Inform="General;%Duration%" $j.webm` / 1000) + $sec) j=$((j+1)) done
Poster Image with Audio
ffmpeg -loop 1 -i 1.png -i 1.wav -c:v libvpx -c:a libvorbis -b:a 64k -shortest out.webm
GUI Options
Recorders
- WebMCam
Records the selected area and saves the output as WebM, just like GifCam does it with GIFs.
https://github.com/TheTarkus/WebMCam/
Converters
- convert_script.lua - A lua script for mpv to convert, crop, resize and encode directly from the mpv window.
- https://github.com/Wsheerio/webmConverter
- https://github.com/MasterOfWebM/WebM-Converter
- https://github.com/WebMBro/WebMConverter
- https://github.com/nixxquality/WebMConverter
http://forum.doom9.org/showthread.php?p=1410972- Died a long time ago.- https://firefogg.org - Requires the Firefogg extension, will only work in Firefox.
You can also refer to Recommended_software for video editing and converting programs.
Sources and Resources
- https://trac.ffmpeg.org/wiki/vpxEncodingGuide
- WebM of a WebM tutorial: https://rbt.asia/boards/g/img/0411/75/1396646705233.webm
- http://www.webmproject.org/docs/encoder-parameters/
- http://wiki.webmproject.org/ffmpeg
- N0Lif3's Windows tutorial: https://www.youtube.com/watch?v=WeM3SUp-HRg
- http://wiki.webmproject.org/ffmpeg/vp9-encoding-guide
- https://github.com/Kagami/webm.py/wiki/Notes-on-encoding-settings
- https://trac.ffmpeg.org/wiki/Encode/VP8
- https://trac.ffmpeg.org/wiki/Encode/VP9
- http://forum.doom9.org/showthread.php?t=168947
- http://slhck.info/video-encoding