How to use the built in Libx265 in FFmpeg?
canbonbon opened this issue · 4 comments
Hello Anime4000, hope you are doing great in the new year. I tried my best but I could not make your new IFME 2.0 work on my machines. So explored a little more and found out that new versions of FFMpeg contain the new x265 version 3.4. So a lot of people actually just use that instead of downloading the HEVC compiler separately and the piping the output form one to another. I tried that but the resultant file size is much larger than what gets created in IFME (old version). Here are the two commands I had used:
"C:\Tools\ffmpeg64\ffmpeg" -hide_banner -ss 0 -i %1 -map_metadata 0 -map_chapters 0 -metadata title="%~n1" -pix_fmt yuv420p10le -c:v libx265 -preset fast -x265-params crf=23:qcomp=0.8:aq-mode=1:aq_strength=1.0:qg-size=16:psy-rd=0.7:psy-rdoq=5.0:rdoq-level=1:merange=44 -c:a copy -c:s copy "C:\converted-HEVC%~n1.HEVC.mkv"
or
"C:\Tools\ffmpeg64\ffmpeg" -hide_banner -ss 0 -i %1 -map_metadata 0 -map_chapters 0 -metadata title="%~n1" -pix_fmt yuv420p10le -c:v libx265 -preset fast -x265-params crf=23 -c:a copy -c:s copy "C:\converted-HEVC%~n1.HEVC.mkv"
In both cases the file size was significantly larger than what gets created by IFME. As you can see I did not pass too many parameters so probably FFmpeg and libx265 are using many defaults. Can you please assist in letting me know what additional parameters I could pass to make this generate comparable file size? I see in the logs that IFME actually pipes the output from FFMpeg and somehow is able to calculate the Frame size (-f xxxxx). That could be one thing that might be resulting in smaller file size and that is something I don't know how to do automatically. But maybe I am wrong.
Could you please suggest what parameters could be passed to make this work and generate smaller size files without compromising on quality too much. I am using CRF=23 but that did not make too much of a difference. Thanks again.
If you using version 20.05, take a look at plugin\video.ffmpeg\_plugin000_vp9.json
file.
You can follow this as example to using ffmpeg as standalone (no pipe)
{
"GUID": "deadbeef-f265-f265-f265-f265f265f265",
"Name": "Libx265 FFmpeg Encoder",
"Version": "",
"X64": false,
"Format": [
"mkv",
"webm"
],
"Author": {
"Developer": "FFmpeg developers",
"URL": "https://ffmpeg.org/"
},
"Update": {
"VersionURL": null,
"DownloadURL": null
},
"Video": {
"Extension": "mp4",
"Encoder": [
{
"BitDepth": 8,
"Binary": "../ffmpeg64/ffmpeg"
}
],
"Preset": [
"ultrafast",
"superfast",
"veryfast",
"faster",
"fast",
"medium",
"slow",
"slower",
"veryslow",
"placebo"
],
"PresetDefault": "medium",
"Tune": [
"off",
"psnr",
"ssim",
"grain",
"zerolatency",
"fastdecode"
],
"TuneDefault": "psnr",
"Args": {
"Pipe": false,
"UnPipe": "-an -sn -dn -c:v libx265",
"Y4M": null,
"Input": "-hide_banner -v error -stats -i",
"Output": "-y",
"Preset": "-preset",
"Tune": "-tune",
"BitDepth": null,
"FrameCount": null,
"PassFirst": null,
"PassLast": null,
"PassNth": null,
"Command": "-map_metadata -1 -map_chapters -1"
},
"Mode": [
{
"Name": "Constant Quality",
"Args": "-crf",
"MultiPass": false,
"Prefix": "",
"Postfix": "",
"Value": {
"DecimalPlace": 0,
"Step": 1,
"Min": 0,
"Max": 51,
"Default": 24
}
},
{
"Name": "Constant Bit Rate",
"Args": "-b:v",
"MultiPass": false,
"Prefix": "",
"Postfix": "k",
"Value": {
"DecimalPlace": 0,
"Step": 1024,
"Min": 128,
"Max": 10485760,
"Default": 1024
}
}
]
}
}
For high compression & High Quality, I use:
720p: CRF 24 @ veryslow
1080p: CRF 24 @ slower
1440p: CRF 24 @ slow
4K: CRF 24 @ medium
You need a Good Processor for this task, Recommended Processor:
- AMD Ryzen 7 3700X, 8 Core 16 Threads (1440p & Lower)
- AMD Ryzen 9 3900X 12 Core 24 Threads (4K to 6K)
- AMD Ryzen 9 3950X 16 Core 32 Threads (8K)
If you have Ryzen 9 3950X and you encoder 1080p, x265 unable to use all 32 threads, there are way to force (--pme --pmod
) x265 to use all 32 threads to make encode faster, but you will sacrifice some quality.
Thanks for your response. I only have IFME-20.05.2_Debug version and that does not have that file. But I will copy from your post and try. Once again, just wanted to let you know that IFME-20.05.2_Debug does not work. So I have been using the very very old IFME 7.7 version. I have checked both and they do not have that file.
Here is the output from IFME 7.7:
ifme [info]: Run command: "C:\Tools\Internet Friendly Media Encoder\plugin\ffmpeg64\ffmpeg" -hide_banner -v error -i "Test.mkv" -strict -1 -map 0:0 -f yuv4mpegpipe -pix_fmt yuv420p10le -s 1920x1036 -r 24 - | "C:\Tools\Internet Friendly Media Encoder\plugin\video.x265gcc\x265-10.exe" - --y4m -p medium --crf 23.0 -t ssim --output-depth 10 -f 143641 -o video0000_und.h265
y4m [info]: 1920x1036 fps 24/1 i420p10 sar 1:1 unknown frame count
raw [info]: output file: video0000_und.h265
x265 [info]: HEVC encoder version 3.2_IFME-ZEN_2
x265 [info]: build info [Windows][GCC 9.3.0][64 bit] 10bit
x265 [info]: using cpu capabilities: MMX2 SSE2Fast LZCNT SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2
x265 [info]: Main 10 profile, Level-4 (Main tier)
x265 [info]: Thread pool created using 4 threads
x265 [info]: Slices : 1
x265 [info]: frame threads / pool features : 2 / wpp(17 rows)
x265 [info]: Coding QT: max CU size, min CU size : 64 / 8
x265 [info]: Residual QT: max TU size, max depth : 32 / 1 inter / 1 intra
x265 [info]: ME / range / subpel / merge : hex / 57 / 2 / 3
x265 [info]: Keyframe min / max / scenecut / bias: 24 / 250 / 40 / 5.00
x265 [info]: Lookahead / bframes / badapt : 20 / 4 / 2
x265 [info]: b-pyramid / weightp / weightb : 1 / 1 / 0
x265 [info]: References / ref-limit cu / depth : 3 / off / on
x265 [info]: AQ: mode / str / qg-size / cu-tree : 2 / 1.0 / 32 / 1
x265 [info]: Rate Control / qCompress : CRF-23.0 / 0.60
x265 [info]: tools: rd=3 early-skip rskip signhide tmvp b-intra
x265 [info]: tools: strong-intra-smoothing lslices=6 deblock sao
as you can see, the biggest thing about this is this parameter: -f 143641. I don't know how it did that and how can I automatically calculate it.
Thanks again for all your help.
the total frame is calculated by length in second * fps
since IFME will make video constant frame rate
Frame Rate -r
now using filter -vf fps=
for proper timing,
IFME always output Constant FPS