[ What I have done ]
I am trying to measure a performance of different ffmpeg decoders by
avcodec_decode_video2(..) takes in ffmpeg.c and running ffmpeg binary the following way~/bin/ffmpeg -benchmark_all -loglevel debug -threads 0 -i ~/Documents/video-input.h264 -c:v libx265 -x265-params crf=25 video-output.hevc
~/bin/ffplay ~/Documents/video-input.h264
In my understanding the average time for the call to that function should be the same whether I am converting the video or playing it, because I am only measuring how long it takes to decode the frame for that video. Is this a wrong way of doing it? Please let me know if I am incorrect. The results I am getting are strange to me - the call to the aforementioned function takes twice as much in ffmpeg binary compared to ffplay binary. I have tried to run ffmpeg binary with -threads 0 and without it, but the results are still the same(twice as long as ffplay). Could it be because ffplay binary simply utilizes more threads? When I try it with -threads 1, ffmpeg takes about 10 times as long as ffplay (which makes sense to me since before it was using several threads and now it is only using 1)
Before I ask my question, I want you to know that I am a beginner in video processing and video encoding/decoding processes.
[My question]
I am wondering what would be an accurate way to measure how long it takes to decode a frame (using 1 thread)? Should I simply measure only how long it takes to call avcodec_decode_video2(..) function using the ffmpeg binary, and not the ffplay binary? Would the results be more accurate that way?
I also tried to enable -benchmark_all -loglevel debug options, but it seems like the following message bench: 64537 decode_video 0.0 is not very helpful if 0.0 is supposed to mean time. (Not sure what the other number means).
If you want a simple way to benchmark decoding use the null muxer:
ffmpeg -i input -f null -
Linux and macOS users can add the time command:
$ time ffmpeg -i input -f null -
[...]
real 0m5.343s
user 0m20.290s
sys 0m0.230s
See man time for more info.
-benchmark optionThe -benchmark option can be added to output CPU time and maximum memory consumption:
$ time ffmpeg -i input -benchmark -f null -
[...]
bench: utime=7.314s
bench: maxrss=72280kB
If you want to just decode a particular stream then use the map option:
ffmpeg -i input -map 0:a:0 -f null -
You can decode with one thread if you want to:
ffmpeg -threads 1 -i input -f null -
Not all decoders have threading capabilities and some have several. You can check decoder details such as ffmpeg -h decoder=h264.
There can be several decoders available for a format. You can name the decoder if you don't want to rely on the default:
ffmpeg -c:v vp8 -i input -f null -
ffmpeg -c:v libvpx -i input -f null -
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With