[Libav-user] MPEG-TS muxrate and bufsize setting in lav*
jettoblack at gmail.com
Tue Jan 1 05:07:29 CET 2013
Happy new year everyone!
I'm trying to encode a CBR transport stream. It works fine using
ffmpeg CLI, but I think I am not setting some parameters correctly
when I try to do it using lav*.
e.g. to encode a 2.2Mbit CBR TS with 2.0Mbit CBR video and 64k audio:
ffmpeg -i source -codec:v libx264 -b:v 2M -minrate 2M -maxrate 2M
-bufsize 1M -muxrate 2.2M -codec:a aac -b:a 64k -ac 2 -ar 48000 out.ts
This works ok. When I try to replicate the same settings in code:
vCC->bit_rate = 2000000; // 2M
vCC->rc_min_rate = vCC->bit_rate;
vCC->rc_max_rate = vCC->bit_rate;
vCC->rc_buffer_size = 1000000; // 1M
AVDictionary *dict = NULL;
av_dict_set(&dict, "muxrate", "2200000", 0); // 2.2M
I think I'm setting the codec bitrate options correctly since I get
this debug output from av_dump_format():
Output #0, mpegts, to 'Stream 0':
Stream #0:0: Video: h264, yuv420p, 1280x720 [SAR 1:1 DAR 16:9],
q=-1--1, 2000 kb/s, 90k tbn, 29.97 tbc
Stream #0:1: Audio: aac, 48000 Hz, stereo, fltp, 64 kb/s
Also I think muxrate is set as intended because I get the message:
[mpegts @ 0x103021800] muxrate 2200000, pcr every 58 pkts, sdt every
1462, pat/pmt every 1462 pkts
However, even if I set the muxrate to an absurdly large value like 10x
the video+audio bitrate, I get these errors on almost every packet:
[mpegts @ 0x103021800] dts < pcr, TS is invalid
This error usually indicates that the encoded bitrate spikes higher
than will fit into the specified muxrate.
I get the same error if I omit the -bufsize parameter to ffmpeg, and
in my code I get the errors regardless of what rc_buffer_size is set
to (or not setting it at all), so I suspect I am not setting the same
variable that bufsize sets, or I'm not using the right value for it.
I looked through ffmpeg.c and couldn't easily find how the -bufsize
parameter gets applied as a format or codec option, or whether ffmpeg
is tweaking my values. However I'm not positive that bufisize is even
related to the problem.
Do I need to set any other rate control or buffer related options for
this to work, such as rc_buffer_aggressivity,
rc_initial_buffer_occupancy, etc.? And if so, what are the
I'm happy to post a self contained example that compiles, if it would help.
Any ideas? Thanks!
More information about the Libav-user