[Live-devel] H.264 in MPEG-2 TS streams roughly at the start
Warren Young
warren at etr-usa.com
Mon Sep 10 16:51:34 PDT 2012
On 9/7/2012 10:13 PM, Ross Finlayson wrote:
>> We've been unable to create files that stream as
>> smoothly as our old MPEG-2 files.
>
> Our code has trouble streaming MPEG Transport Stream files that are
> extremely VBR (variable bit rate), which is what I suspect your file is.
Yes, that's right. It averages 8 Mbit/s, but it has peaks in the 20
Mbit/s range, and falls well below the average at times.
Do you have any ffmpeg recipes for reducing variability? I ask because
it seems to treat parameters like -maxrate the same way people treat
speed limits. :)
That is, are there known ways to tell it, "No really, I'm not kidding,
max means max."?
I'm not against using another encoder. We have several. It's just that
most of the TS-capable ones we have are inflexible. They assume you're
using some common hardware profile like ATSC, AVCHD, or BluRay. They
either won't let you tune overall bit rate, or when you try, they create
broken streams.
> Down the road, a better solution might be to provide an alternative
> implementation of the "MPEG2TransportStreamFramer" class that 'reads
> ahead'...less efficient
That wouldn't bother us at all.
Our servers have gigs of RAM in them these days, and they are only being
asked to serve dozens of streams maximum. If each took a few tens of MB
so the server would have a big enough window to examine the stream
before sending it out, it wouldn't be a problem.
You can call it TAKE_LOTS_O_RAM_TO_PREBUFFER_THE_STREAM compile time
parameter.
> Another possibility would be store packet durations in the 'index file'
> (that gets used when performing 'trick play' operations on Transport
> Stream files. The disadvantage of this, however, is that it would work
> only for prerecorded files, not 'live' input streams (e.g., from an
> encoder). It would also require an incompatible change to the index
> file format.
I'm surprised you can't get what you need from the index file already.
Doesn't it tell you whee all the I frames are in the file? If you take
a guess at the GOP length, you can infer frame rate.
It would be better if the file header included the observed average GOP
length instead, of course.
Then again, if the indexer were to do that, it could simply record the
observed average bit rate, and its variability. That would help the
RTSP server decide on an optimal buffer size. Instead of guessing
something like "24 MB" it could say "(avg_bit_rate + max_variability) *
seconds_of_buffer / 8" to get the buffer size in bytes necessary to hold
that many seconds of video.
From what we're seeing with this stream, it seems you need to prebuffer
30 seconds or so, before the current implementation can get a handle on
overall bit rate. Using the 8 Mbit/s = 1 MB/second rule of thumb again,
that means 30 MB. In 1 GB of RAM, that lets you stream 34 streams,
plenty for us.
More information about the live-devel
mailing list