gpt4 book ai didi

FFMPEG 解码太慢 (avcodec_send_packet()/avcodec_receive_frame())

转载 作者:行者123 更新时间:2023-12-01 06:51:52 25 4
gpt4 key购买 nike

我正在使用 ffmpeg 库对 MPEG 传输流中的视频进行解码、缩放和重新编码。我刚刚从源代码重新编译到 v3.3.2,并从旧的 avcodec_decode_video2() API 更改为新的发送/接收 API。

新旧 API 都非常缓慢地解码视频。

25 fps 视频 = 每 40 毫秒 1 帧。但是,我看到每帧需要 70 到 120 毫秒来解码。这是一个文件翻译器,因此需要它比实时运行得更快。

代码大纲如下。有人对如何提高解码速度有任何想法吗?还有其他关于已弃用的 avcodec_decode_video2() 的帖子缓慢;这些都没有得到解决。新的 API 并没有运行得更快……

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

一些输出
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 版本

在 core2 duo 3.2 GHz、32 位 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

最佳答案

供将来引用的可能解决方案如下:
为解码器启用多线程。默认情况下,解码器只使用一个线程,取决于解码器,多线程可以大大加快解码速度。
假设您有 AVFormatContext *format_ctx , 匹配的编解码器 AVCodec* codecAVCodecContext* codec_ctx (使用 avcodec_alloc_context3 分配)。
之前 打开编解码器上下文(使用 avcodec_open2 )您可以配置多线程。检查编解码器的功能以确定可以使用哪种多线程:

// set codec to automatically determine how many threads suits best for the decoding job
codec_ctx->thread_count = 0;

if (codec->capabilities | AV_CODEC_CAP_FRAME_THREADS)
codec_ctx->thread_type = FF_THREAD_FRAME;
else if (codec->capabilities | AV_CODEC_CAP_SLICE_THREADS)
codec_ctx->thread_type = FF_THREAD_SLICE;
else
codec_ctx->thread_count = 1; //don't use multithreading

关于FFMPEG 解码太慢 (avcodec_send_packet()/avcodec_receive_frame()),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45363566/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com