我使用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] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX
[libx264 @ 20d1b840] profile High, level 4.0
[libx264 @ 20d1b840] 264 - core 142 r2431 ac76440 - H.264/MPEG-4 AVC codec - Copyleft 2003-2014 - http://www.videolan.org/x264.html - options: cabac=0 ref=1 deblock=1:0:0 analyse=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 interlaced=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消息,我尝试了来自此问题的方法。但仍需要注意参数的重要性以便能够创建如此小的视频。欢迎提出任何建议。