FFMPEG decoding is too slow (avcodec_send_packet () / avcodec_receive_frame ())
I am using ffmpeg libraries for decoding, scaling and re-encoding video in MPEG transport stream. I just recompiled from source in v3.3.2 and changed it from the old avcodec_decode_video2 () API to the new send / receive API.
Both old and new APIs decode video very slowly.
25 frames per second video = 1 frame every 40ms. However, I see 70 to 120ms per frame for decoding. It is a file translator, so it needs to be faster than real time.
Below is the code. Anyone have any ideas on how to improve the decoding speed? There are other reports that deprecated is avcodec_decode_video2()
slow; none of them were allowed. The new API doesn't work any faster ...
gettimeofday(&tv1, NULL);
int rc = av_read_frame(pFormatContext, pESPacket);
gettimeofday(&tv2, NULL);
int ret = avcodec_send_packet(pDecoderContext, pESPacket);
if (ret < 0)
continue;
ret = avcodec_receive_frame(pDecoderContext, pFrameDec);
if (ret != 0)
{
printf("avcodec_receive_frame error: %d\n", ret);
continue;
}
gettimeofday(&tv3, 0);
u_long twoMinusOne = (tv2.tv_sec - tv1.tv_sec) * 1000000 + tv2.tv_usec - tv1.tv_usec;
u_long threeMinusTwo = (tv3.tv_sec - tv2.tv_sec) * 1000000 + tv3.tv_usec - tv2.tv_usec;
size_t pktSize = mPacketQueue.getTsPktListSize();
printf(" DECODE ReadFrame %lu usec, DecodeVideo %lu usec. mTsPacketList %u items\n", twoMinusOne, threeMinusTwo, pktSize);
transcodeFrame(pFrameDec);
// Scale and re-encode //
-- call avscale to downsample
-- call avcodec_encode_video2() to encode
Some output
DECODE ReadFrame 6 usec, DecodeVideo 154273 usec.
Dump mpFrameEnc with DateTime:
AVFrame Info frame 720 X 406. PTS = 305700353 PKT_PTS = 305700353 Linesize[0]=720. Linesize[1]=360. Linesize[2]=360.
Time taken to ENCODE video frame = 3685 usec. Scaling time 4 usec
DECODE ReadFrame 8 usec, DecodeVideo 128203 usec.
Time taken to ENCODE video frame = 3724 usec. Scaling time 3 usec
DECODE ReadFrame 8 usec, DecodeVideo 69321 usec.
Time taken to ENCODE video frame = 3577 usec. Scaling time 3 usec
FFMPEG version
Benchmarks performed on 3.2GHz Core2 Duo, 32-bit Centos 6.
bin/ffmpeg
ffmpeg version 3.3.2 Copyright (c) 2000-2017 the FFmpeg developers
built with gcc 4.4.7 (GCC) 20120313 (Red Hat 4.4.7-11)
configuration: --prefix=/mnt/swdevel/DVStor/source_build/ext/ffmpeg-build --libdir=/mnt/swdevel/DVStor/source_build/ext/ffmpeg-build/lib3p_build --shlibdir=/mnt/swdevel/DVStor/source_build/ext/ffmpeg-build/lib3p_build --disable-static --enable-shared --disable-cuda --disable-cuvid --disable-nvenc --enable-libx264 --enable-gpl --extra-cflags=-I/usr/local/include/libx264
libavutil 55. 58.100 / 55. 58.100
libavcodec 57. 89.100 / 57. 89.100
libavformat 57. 71.100 / 57. 71.100
libavdevice 57. 6.100 / 57. 6.100
libavfilter 6. 82.100 / 6. 82.100
libswscale 4. 6.100 / 4. 6.100
libswresample 2. 7.100 / 2. 7.100
libpostproc 54. 5.100 / 54. 5.100
Hyper fast Audio and Video encoder
source to share
If you are still looking for help.
Depending on the aspect ratio of the video, VLC may use the GPU to decode it. To make sure you are using GPU-Z (only works on windows, there are similar tools for Linux) to measure the video loading engine. In this case, you may need to check if your GPU libraries support encoding / decoding.
source to share