无法使用FFmpeg对单帧h264(.mp4)视频进行编码。没有视频流

时间:2015-05-04 23:36:14

标签: c++ encoding ffmpeg mp4 h.264

我使用命令使用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 qp​​step = 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(&param, "preset", "slow", 0);
            av_dict_set(&param, "profile", "high", 0);
            av_dict_set(&param, "crf", "10", 0); //this gave me quality
            av_dict_set(&param, "force_key_frames", "1", 0);

在我的编码中,我刚刚添加了

ppicture->pts = pCodecCtx->frame_number

避免非严格单调的PTS 消息。并尝试了this question中的方法以防万一。

我确信我必须错过一些重要参数才能创建如此小的视频。我会接受任何建议。

1 个答案:

答案 0 :(得分:0)

将单帧发送到编码器后,必须将空帧发送到刷新编码器。

avcodec_send_frame(enc, nullptr);
avcodec_receive_packet(enc, pkt);