我使用命令使用ffmpeg命令行工具实现了这一点。该文件夹只有一个图像。
ffmpeg -r 24 -i image%03d.bmp -c:v libx264 -pix_fmt yuv420p oneframex.mp4
我想用C ++做同样的事情。如果我对三帧或更多帧的视频进行编码,则视频编码正确,但编码一帧或两帧视频的结果从来没有视频流,如ffprobe和一些媒体播放器所报道的那样。
与ffprobe相比,我的视频(具有三个或更多帧的视频)和命令工具生成的视频显示的信息几乎相同。只有比特率和编码器版本不同。
我尝试将force_key_frames添加到1,尝试使用多种编码选项并且不成功。
应用程序输出提供了以下信息:
[libx264 @ 20d1b840]使用cpu功能:MMX2 SSE2Fast SSSE3 SSE4.2 AVX
[libx264 @ 20d1b840]个人资料高,等级4.0
[libx264 @ 20d1b840] 264 - 核心142 r2431 ac76440 - H.264 / MPEG-4 AVC 编解码器 - Copyleft 2003-2014 - http://www.videolan.org/x264.html - options:cabac = 0 ref = 1 deblock = 1:0:0 analyze = 0x3:0x113 me = dia subme = 8 psy = 1 psy_rd = 1.00:0.00 mixed_ref = 0 me_range = 16 chroma_me = 0 trellis = 0 8x8dct = 1 cqm = 0 deadzone = 21,11 fast_pskip = 1 chroma_qp_offset = -2 threads = 1 lookahead_threads = 1 sliced_threads = 0 nr = 0 decimate = 1 隔行扫描= 0 bluray_compat = 0 constrained_intra = 0 bframes = 0 weightp = 0 keyint = 1 keyint_min = 1 scenecut = 0 intra_refresh = 0 rc = crf mbtree = 0 crf = 10.0 qcomp = 0.60 qpmin = 0 qpmax = 25 qpstep = 4 ip_ratio = 1.40 aq = 1:1.00
这些是我的主要参数:
pCodecCtx->codec_id = AV_CODEC_ID_H264;
pCodecCtx->pix_fmt= AV_PIX_FMT_YUV420P;
pCodecCtx->gop_size = 1;
pCodecCtx->bit_rate = 400000;
pCodecCtx->me_range = 16;
pCodecCtx->max_qdiff = 4;
pCodecCtx->qcompress = 0.6;
pCodecCtx->qmin = 0;
pCodecCtx->qmax = 25;
pCodecCtx->time_base.den = 24;
pCodecCtx->time_base.num = 1;
AVDictionary *param = 0;
av_dict_set(¶m, "preset", "slow", 0);
av_dict_set(¶m, "profile", "high", 0);
av_dict_set(¶m, "crf", "10", 0); //this gave me quality
av_dict_set(¶m, "force_key_frames", "1", 0);
在我的编码中,我刚刚添加了
ppicture->pts = pCodecCtx->frame_number
避免非严格单调的PTS 消息。并尝试了this question中的方法以防万一。
我确信我必须错过一些重要参数才能创建如此小的视频。我会接受任何建议。
答案 0 :(得分:0)
将单帧发送到编码器后,必须将空帧发送到刷新编码器。
avcodec_send_frame(enc, nullptr);
avcodec_receive_packet(enc, pkt);