Newest 'libx264' Questions - Stack Overflow
Les articles publiés sur le site
-
libavcodec/libx264 do not produce B-frames
6 novembre 2013, par Rob SchmidtI am writing an application in C++ that uses libavcodec with libx264 to encode video. However, the encoded data ended up being much larger than I expected. I analyzed the results and discovered that my encoding never produced B-frames, only I- and P-frames.
I created a standalone utility based on the ffmpeg source code and examples to test my encoder setup. It reads in an H.264 file, re-encodes the decoded frames, and outputs the result to a file using the ITU H.264 Annex B format. I also used ffmpeg to perform the same operation so I could compare against a known good implementation. My utility never outputs B-frames whereas ffmpeg does.
I have since tried to figure out what ffmpeg does that my code doesn't. I first tried manually specifying encoder settings related to B-frames. This had no effect.
I then tried running both ffmpeg and my utility under gdb and comparing the contents of the AVStream, AVCodecContext, and X264Context prior to opening the encoder and manually setting any fields that appeared different. Even with identical settings, I still only produce I- and P-frames.
Finally, I thought that perhaps the problem was with my timestamp handling. I reworked my test utility to mimic the pipeline used by ffmpeg and to output timestamp debugging output like ffmpeg does. Even with my timestamps identical to ffmpeg's I still get no B-frames.
At this point I don't know what else to try. When I run ffmpeg, I run it with the command line below. Note that aside from the "superfast" preset, I pretty much use the default values.
ffmpeg -v debug -i ~/annexb.264 -codec:v libx264 -preset superfast -g 30 -f h264 ./out.264
The code that configures the encoder is listed below. It specifies the "superfast" preset too.
static AVStream *add_video_stream(AVFormatContext *output_ctx, AVCodec **output_codec, enum AVCodecID codec_id) { *output_codec = avcodec_find_encoder(codec_id); if (*output_codec == NULL) { printf("Could not find encoder for '%s' (%d)\n", avcodec_get_name(codec_id), codec_id); return NULL; } AVStream *output_stream = avformat_new_stream(output_ctx, *output_codec); if (output_stream == NULL) { printf("Could not create video stream.\n"); return NULL; } output_stream->id = output_ctx->nb_streams - 1; AVCodecContext *codec_ctx = output_stream->codec; avcodec_get_context_defaults3(codec_ctx, *output_codec); codec_ctx->width = 1280; codec_ctx->height = 720; codec_ctx->time_base.den = 15000; codec_ctx->time_base.num = 1001; /* codec_ctx->gop_size = 30;*/ codec_ctx->pix_fmt = AV_PIX_FMT_YUVJ420P; // try to force B-frame output /* codec_ctx->max_b_frames = 3;*/ /* codec_ctx->b_frame_strategy = 2;*/ output_stream->sample_aspect_ratio.num = 1; output_stream->sample_aspect_ratio.den = 1; codec_ctx->sample_aspect_ratio.num = 1; codec_ctx->sample_aspect_ratio.den = 1; codec_ctx->chroma_sample_location = AVCHROMA_LOC_LEFT; codec_ctx->bits_per_raw_sample = 8; if ((output_ctx->oformat->flags & AVFMT_GLOBALHEADER) != 0) { codec_ctx->flags |= CODEC_FLAG_GLOBAL_HEADER; } return output_stream; } int main(int argc, char **argv) { // ... open input file avformat_alloc_output_context2(&output_ctx, NULL, "h264", output_path); if (output_ctx == NULL) { fprintf(stderr, "Unable to allocate output context.\n"); return 1; } AVCodec *output_codec = NULL; output_stream = add_video_stream(output_ctx, &output_codec, output_ctx->oformat->video_codec); if (output_stream == NULL) { fprintf(stderr, "Error adding video stream to output context.\n"); return 1; } encode_ctx = output_stream->codec; // seems to have no effect #if 0 if (decode_ctx->extradata_size != 0) { size_t extradata_size = decode_ctx->extradata_size; printf("extradata_size: %zu\n", extradata_size); encode_ctx->extradata = av_mallocz(extradata_size + FF_INPUT_BUFFER_PADDING_SIZE); memcpy(encode_ctx->extradata, decode_ctx->extradata, extradata_size); encode_ctx->extradata_size = extradata_size; } #endif // 0 AVDictionary *opts = NULL; av_dict_set(&opts, "preset", "superfast", 0); // av_dict_set(&opts, "threads", "auto", 0); // seems to have no effect ret = avcodec_open2(encode_ctx, output_codec, &opts); if (ret < 0) { fprintf(stderr, "Unable to open output video cocec: %s\n", av_err2str(ret)); return 1; } // ... decoding/encoding loop, clean up, etc. return 0; }
My test utility produces the following debug output in which you can see there are no B-frames produced:
[libx264 @ 0x1b8c9c0] using mv_range_thread = 56 [libx264 @ 0x1b8c9c0] using SAR=1/1 [libx264 @ 0x1b8c9c0] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX [libx264 @ 0x1b8c9c0] profile High, level 3.1 Output #0, h264, to './out.264': Stream #0:0, 0, 1/90000: Video: h264, yuvj420p, 1280x720 [SAR 1:1 DAR 16:9], 1001/15000, q=-1--1, 90k tbn, 14.99 tbc
[libx264 @ 0x1b8c9c0] frame= 0 QP=17.22 NAL=3 Slice:I Poc:0 I:3600 P:0 SKIP:0 size=122837 bytes [libx264 @ 0x1b8c9c0] frame= 1 QP=18.03 NAL=2 Slice:P Poc:2 I:411 P:1825 SKIP:1364 size=25863 bytes [libx264 @ 0x1b8c9c0] frame= 2 QP=17.03 NAL=2 Slice:P Poc:4 I:369 P:2159 SKIP:1072 size=37880 bytes [libx264 @ 0x1b8c9c0] frame= 3 QP=16.90 NAL=2 Slice:P Poc:6 I:498 P:2330 SKIP:772 size=50509 bytes [libx264 @ 0x1b8c9c0] frame= 4 QP=16.68 NAL=2 Slice:P Poc:8 I:504 P:2233 SKIP:863 size=50791 bytes [libx264 @ 0x1b8c9c0] frame= 5 QP=16.52 NAL=2 Slice:P Poc:10 I:513 P:2286 SKIP:801 size=51820 bytes [libx264 @ 0x1b8c9c0] frame= 6 QP=16.49 NAL=2 Slice:P Poc:12 I:461 P:2293 SKIP:846 size=51311 bytes [libx264 @ 0x1b8c9c0] frame= 7 QP=16.65 NAL=2 Slice:P Poc:14 I:476 P:2287 SKIP:837 size=51196 bytes [libx264 @ 0x1b8c9c0] frame= 8 QP=16.66 NAL=2 Slice:P Poc:16 I:508 P:2240 SKIP:852 size=51577 bytes [libx264 @ 0x1b8c9c0] frame= 9 QP=16.55 NAL=2 Slice:P Poc:18 I:477 P:2278 SKIP:845 size=51531 bytes [libx264 @ 0x1b8c9c0] frame= 10 QP=16.67 NAL=2 Slice:P Poc:20 I:517 P:2233 SKIP:850 size=51946 bytes [libx264 @ 0x1b8c9c0] frame I:7 Avg QP:13.71 size:152207 [libx264 @ 0x1b8c9c0] frame P:190 Avg QP:16.66 size: 50949 [libx264 @ 0x1b8c9c0] mb I I16..4: 27.1% 30.8% 42.1% [libx264 @ 0x1b8c9c0] mb P I16..4: 6.8% 6.0% 0.8% P16..4: 61.8% 0.0% 0.0% 0.0% 0.0% skip:24.7% [libx264 @ 0x1b8c9c0] 8x8 transform intra:41.2% inter:86.9% [libx264 @ 0x1b8c9c0] coded y,uvDC,uvAC intra: 92.2% 28.3% 5.4% inter: 50.3% 1.9% 0.0% [libx264 @ 0x1b8c9c0] i16 v,h,dc,p: 7% 7% 77% 8% [libx264 @ 0x1b8c9c0] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 7% 15% 49% 6% 4% 3% 5% 3% 8% [libx264 @ 0x1b8c9c0] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 19% 25% 24% 6% 7% 4% 6% 3% 6% [libx264 @ 0x1b8c9c0] i8c dc,h,v,p: 72% 14% 10% 4% [libx264 @ 0x1b8c9c0] Weighted P-Frames: Y:0.0% UV:0.0% [libx264 @ 0x1b8c9c0] kb/s:6539.11 ffmpeg, on the other hand, produces the following output that is almost identical but includes B-frames:
[libx264 @ 0x20b9c40] using mv_range_thread = 56 [libx264 @ 0x20b9c40] using SAR=1/1 [libx264 @ 0x20b9c40] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX [libx264 @ 0x20b9c40] profile High, level 3.1 [h264 @ 0x20b8160] detected 4 logical cores Output #0, h264, to './out.264': Metadata: encoder : Lavf54.63.104 Stream #0:0, 0, 1/90000: Video: h264, yuvj420p, 1280x720 [SAR 1:1 DAR 16:9], 1001/15000, q=-1--1, 90k tbn, 14.99 tbc Stream mapping: Stream #0:0 -> #0:0 (h264 -> libx264)
[libx264 @ 0x20b9c40] frame= 0 QP=17.22 NAL=3 Slice:I Poc:0 I:3600 P:0 SKIP:0 size=122835 bytes [libx264 @ 0x20b9c40] frame= 1 QP=18.75 NAL=2 Slice:P Poc:8 I:984 P:2045 SKIP:571 size=54208 bytes [libx264 @ 0x20b9c40] frame= 2 QP=19.40 NAL=2 Slice:B Poc:4 I:447 P:1581 SKIP:1572 size=24930 bytes [libx264 @ 0x20b9c40] frame= 3 QP=19.78 NAL=0 Slice:B Poc:2 I:199 P:1002 SKIP:2399 size=10717 bytes [libx264 @ 0x20b9c40] frame= 4 QP=20.19 NAL=0 Slice:B Poc:6 I:204 P:1155 SKIP:2241 size=15937 bytes [libx264 @ 0x20b9c40] frame= 5 QP=18.11 NAL=2 Slice:P Poc:16 I:990 P:2221 SKIP:389 size=64240 bytes [libx264 @ 0x20b9c40] frame= 6 QP=19.35 NAL=2 Slice:B Poc:12 I:439 P:1784 SKIP:1377 size=34048 bytes [libx264 @ 0x20b9c40] frame= 7 QP=19.88 NAL=0 Slice:B Poc:10 I:275 P:1035 SKIP:2290 size=16911 bytes [libx264 @ 0x20b9c40] frame= 8 QP=19.91 NAL=0 Slice:B Poc:14 I:257 P:1270 SKIP:2073 size=19172 bytes [libx264 @ 0x20b9c40] frame= 9 QP=17.90 NAL=2 Slice:P Poc:24 I:962 P:2204 SKIP:434 size=67439 bytes [libx264 @ 0x20b9c40] frame= 10 QP=18.84 NAL=2 Slice:B Poc:20 I:474 P:1911 SKIP:1215 size=37742 bytes [libx264 @ 0x20b9c40] frame I:7 Avg QP:15.95 size:130124 [libx264 @ 0x20b9c40] frame P:52 Avg QP:17.78 size: 64787 [libx264 @ 0x20b9c40] frame B:138 Avg QP:19.32 size: 26231 [libx264 @ 0x20b9c40] consecutive B-frames: 6.6% 0.0% 0.0% 93.4% [libx264 @ 0x20b9c40] mb I I16..4: 30.2% 35.2% 34.6% [libx264 @ 0x20b9c40] mb P I16..4: 13.9% 11.4% 0.3% P16..4: 60.4% 0.0% 0.0% 0.0% 0.0% skip:13.9% [libx264 @ 0x20b9c40] mb B I16..4: 5.7% 3.3% 0.0% B16..8: 15.8% 0.0% 0.0% direct:25.7% skip:49.5% L0:43.2% L1:37.3% BI:19.5% [libx264 @ 0x20b9c40] 8x8 transform intra:39.4% inter:77.2% [libx264 @ 0x20b9c40] coded y,uvDC,uvAC intra: 90.7% 26.6% 3.0% inter: 34.0% 4.1% 0.0% [libx264 @ 0x20b9c40] i16 v,h,dc,p: 7% 7% 77% 9% [libx264 @ 0x20b9c40] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 7% 16% 51% 5% 4% 3% 5% 3% 7% [libx264 @ 0x20b9c40] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 22% 27% 20% 6% 6% 3% 6% 3% 6% [libx264 @ 0x20b9c40] i8c dc,h,v,p: 71% 15% 11% 3% [libx264 @ 0x20b9c40] Weighted P-Frames: Y:0.0% UV:0.0% [libx264 @ 0x20b9c40] kb/s:4807.16 I'm sure I'm missing something simple, but I can't for the life of me see what it is. Any assistance would be greatly appreciated.
-
Unable to link with libx264.lib static library
3 novembre 2013, par dtumaykinI'm building custom video encoder using x264 as a static library. I've followed this guide in order to build static library. Trying to compile this:
x264_t * setup_encoder(int width, int height){ x264_param_t param; x264_param_default_preset(¶m, "veryfast", "zerolatency"); param.i_threads = 1; param.i_width = width; param.i_height = height; param.i_fps_num = 26; param.i_fps_den = 1; // Intra refres: param.i_keyint_max = 26; param.b_intra_refresh = 1; //Rate control: param.rc.i_rc_method = X264_RC_CRF; param.rc.f_rf_constant = 25; param.rc.f_rf_constant = 25; param.rc.f_rf_constant_max = 35; //For streaming: param.b_repeat_headers = 1; param.b_annexb = 1; x264_param_apply_profile(¶m, "baseline"); return x264_encoder_open(¶m); }
Results in:
main.obj : error LNK2019: unresolved external symbol "int __cdecl x264_param_default_preset(struct x264_param_t *,char const *,char const *)"
main.obj : error LNK2019: unresolved external symbol "int __cdecl x264_param_apply_profile(struct x264_param_t *,char const *)"
main.obj : error LNK2019: unresolved external symbol "struct x264_t * __cdecl x264_encoder_open_136(struct x264_param_t *)"
%PROJECT_DIR%: fatal error LNK1120: 3 unresolved externals
Linker scans libx264.lib, but can't find anything inside.
Searching .\lib\libx264.lib:
With dumpbin /HEADERS I can actually find the declaration I need, but linker is unable to do it.
SECTION HEADER #38 .text name 0 physical address 0 virtual address E60 size of raw data 930C file pointer to raw data (0000930C to 0000A16B) D219 file pointer to relocation table 0 file pointer to line numbers 40 number of relocations 0 number of line numbers 60501020 flags Code COMDAT; sym= x264_param_default_preset 16 byte align Execute Read
Enviroment is Visual Studio 2012 with Intel Compiler 14 on Windows 8 64-bit.
-
Can't open encoder when use libavcodec
1er novembre 2013, par liuyanghejerryI'm using libavcodec, version 9.7, to write a simple demo, almost exactly like example in official example.
However, I can't open encoder. Also,
av_opt_set(context->priv_data, "preset", "slow", 0)
always leads to crush.This is my code:
// other code... int ret = 0; avcodec_register_all(); AVCodec* codec = NULL; AVCodecContext* context = NULL; AVFrame* frame = NULL; uint8_t endcode[] = { 0, 0, 1, 0xb7 }; codec = avcodec_find_encoder(AV_CODEC_ID_H264); if(!codec){ qDebug()<<"cannot find encoder"; return; } qDebug()<<"encoder found"; context = avcodec_alloc_context3(codec); if(!context){ qDebug()<<"cannot alloc context"; return; } qDebug()<<"context allocted"; context->bit_rate = 400000; /* resolution must be a multiple of two */ context->width = 352; context->height = 288; /* frames per second */ context->time_base= (AVRational){1,25}; context->gop_size = 10; /* emit one intra frame every ten frames */ context->max_b_frames=1; context->pix_fmt = AV_PIX_FMT_YUV420P; qDebug()<<"context init"; // av_opt_set(context->priv_data, "preset", "slow", 0); // this will crush AVDictionary *d = NULL; av_dict_set(&d, "preset", "ultrafast",0); // this won't ret = avcodec_open2(context, codec, &d); if ( ret < 0) { qDebug()<<"cannot open codec"</ other code...
This outputs:
encoder found
context allocted
context init
cannot open codec -22
[libx264 @ 0340B340] [IMGUTILS @ 0028FC34] Picture size 0x10 is invalid
[libx264 @ 0340B340] ignoring invalid width/height values
[libx264 @ 0340B340] Specified pix_fmt is not supported
I don't think the width/height is invalid and format there either. I have no idea what's wrong here.
Any help. plz?
-
Warning when streaming with vlc and x264 at a slow framerate
24 octobre 2013, par jln611I am using libvlc and libx264 to stream images from a C++ program. It provides libvlc uncompressed images using the get and release callback. Everything seems to work ok at higher framerate (over 12 fps) but when I try slower framerates (from 1 to 10), I got the following warnings :
[030d5c6c] mux_ts mux debug: adjusting rate at 0/500000 (3/0) [030d5c6c] main mux warning: late buffer for mux input (2127998) [030d5c6c] mux_ts mux debug: adjusting rate at 0/500000 (3/0)
Over 4 fps, I am able to get the stream (for instance with vlc GUI) but under 4 fps, I got nothing, or sometimes a freeze image. The libvlc arguments are the following :
--imem-get=15543672 --imem-release=15538482 --imem-data=0 --imem-codec=RV24 --imem-cookie=aCookie --imem-cat=2 --imem-height=960 --imem-width=1280 --verbose=2 --imem-id=1 --imem-group=1 --imem-fps=2.000000 -vvv --play-and-exit --no-audio --sout=#transcode{vcodec=h264, fps=2.000000, vb=200k,venc=x264{preset=ultrafast}}:standard{access=http,mux=ts,dst=0.0.0.0:8091/video}
Any hints would be appreciated.
-
"File for preset 'libx264-hq' not found" error in Eclipse (Windows)
22 octobre 2013, par RitaWhen I use the command line to execute, f.e.,
"ffmpeg -i input.avi -vcodec libx264 -vpre libx264-hq -b 1500k output.mp4"
the .mp4 file with h264 is successfully created. However, if I try to execute the same command on Eclipse I get the "File for preset 'libx264-hq' not found" error even though I've already created the preset file and downloaded the library (because I used to have that same error in the command line).
My question is: do I have to put the preset file anywhere else in order to make it function through Eclipse?
Btw, I'm using Windows. There's a lack of information about ffmpeg for Windows.