wang-bin / QtAV

A cross-platform multimedia framework based on Qt and FFmpeg. 基于Qt和FFmpeg的跨平台高性能音视频播放框架. Recommand to use new sdk https://github.com/wang-bin/mdk-sdk
http://qtav.org
3.98k stars 1.5k forks source link

Playing Image Sequences Buffering Problem #422

Open Xuno opened 9 years ago

Xuno commented 9 years ago

Our forked player updated with commit fe1aa216908527577307fefa63a1ebedb5b7ae77 of QtAV plays image sequences from local hard drive.

On high resolution frames like 3840x2160 if fps exceeds the i/o capability of the PC the first few seconds play OK then the player stalls in a buffering loop.

Debug: status changed "Buffered" Debug: status changed "Buffering..." Debug: status changed "Buffered" Debug: status changed "Buffering..." Debug: status changed "Buffered" Debug: status changed "Buffering..."

By comparison ffplay.exe plays frames at a consistent rate even if slowed down due to i/o limitations.

i.e. ffplay.exe -i c:\demo\Raw_3840x2160\%06d.tif

Testing with changes in /menu/setup Misc and AVformat were unsuccessful in solving this problem. What changes can be made to PacketBuffer.cpp allowing for smooth sequential image play when i/o is limited?

The ability to play full resolution 4K RAW images when color grading and other tasks is preferable to small resolution displayed in proxy players embedded in most post production software.

--- Want to back this issue? **[Post a bounty on it!](https://www.bountysource.com/issues/13124293-playing-image-sequences-buffering-problem?utm_campaign=plugin&utm_content=tracker%2F307703&utm_medium=issues&utm_source=github)** We accept bounties via [Bountysource](https://www.bountysource.com/?utm_campaign=plugin&utm_content=tracker%2F307703&utm_medium=issues&utm_source=github).
Xuno commented 9 years ago

If clock is set to Video and Buffer Frames to -1 multiple frames still buffer, play and then waits for buffer to refill. We need a no timing option where playback is determined by PC's i/o the same way ffplay works if specified fps can not be reached.

wang-bin commented 9 years ago

try to set 1

Xuno commented 9 years ago

Better results with clock set to video, Buffer Frames 1, AvFormat Reduced Buffering checked, Probe Size 0, Max analyze duration 0. We are splitting Setup Menu options for Video and Image Sequences in the next version with optimum default preset.

It plays as expected based on system i/o for a short while then stops with the following error:

Debug: status changed "Buffered" Debug: status changed "Buffering..." Warning: Queue is still empty Debug: >>>>>>>>>>>>>>disable slider Debug: Succeed to enable screen saver (1) Debug: status changed "" Debug: >>>>>>>>>>>>>>disable slider Debug: Succeed to enable screen saver (1) Warning: QObject::killTimer(): Error: timer id 5 is not valid for object 0x15f8b0 (MainWindow, ), timer has not been killed

Xuno commented 9 years ago

Image Sequence defaults and separate setup menu options have been added to the latest version.

wswjwjcjlu commented 9 years ago

I think I just got the same issue. Trying to play http://204.191.3.124:82/live-spts/pandacam/transmux/index.m3u8 on my player (which is just a litter fancier simpleplayer). Here is the details of this m3u8 file:

EXTM3U

EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=3000000

CCURstream3000000.m3u8

EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=2500000

CCURstream2500000.m3u8

EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1800000

CCURstream1800000.m3u8

EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1200000

CCURstream1200000.m3u8

EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=600000

CCURstream600000.m3u8

And here is my player init part: VideoRendererId v = VideoRendererId_Widget; v = VideoRendererId_GLWidget2; //v = VideoRendererId_OpenGLWidget; m_player = new AVPlayer(this); m_re = VideoRendererFactory::create(v); m_player->setRenderer(m_re); static const QStringList str = QStringList()<<"OpenAL"; m_player->audio()->setBackends(str); m_player->setBufferMode(QtAV::BufferBytes); m_player->setBufferValue(1000);

When I tried the low bitrate stream (1.8/1.2/0.6 MB/s) everything is fine. But with high bitrate (2.5/3.0 MB/s), I get the same issue: playing a few seconds (in 2.5 it is a little longer, like 10 seconds, in 3.0 only 2-3 seconds), then dropping a lot of frames, finally stop.

setInteruptOntimeout and setbuffermode/value(I tried all mode and different value (-1, 0, 1, very large)) don't fix it. Cause this stream doesn't have audio track, I even try set masterclock to video or eternel without any effects. So I think maybe there is an internal buffer or something not working when playing high bitrate stream. Let me know what's your idea. Thank you very much