Quantcast
Channel: Media Foundation Development for Windows Desktop forum
Viewing all articles
Browse latest Browse all 1079

Microsoft Video 1 AVI File Playback Issue when FPS > 1

$
0
0

Hi,

I tried to create a compressed AVI file using VFW in C++. However the compressed AVI file seems cannot be played correctly in Media Player. Media Player will close before the last frame duration ends.

For example, a AVI file is generated with 0.125 FPS, one frame should lasts for 8 seconds. If the file has 5 frames, the length should be 40 seconds. But the Media Player will stop at 00:31~00:32, just after the last frame is drawn. 

A uncompressed file with same fps could be played correctly, including the last frame. The Media Player will ends at 00:40 correctly.

I tried to convert the uncompressed file using ffmpeg with msvideo1 encoder, the output file still cannot be played correctly.

VLC cannot play this file correctly either.

Here's some code I used to prepare the stream:

    AVISTREAMINFO StreamInfo;
    ZeroMemory(&StreamInfo, sizeof(AVISTREAMINFO));

    FrameInfo.bmiHeader.biPlanes = 1;
    FrameInfo.bmiHeader.biWidth = 512;
    FrameInfo.bmiHeader.biHeight = 512;
    FrameInfo.bmiHeader.biCompression = BI_RGB;
    FrameInfo.bmiHeader.biBitCount = 24;
    FrameInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    FrameInfo.bmiHeader.biSizeImage = 512 * 512 * 3;

    auto HIC = ICOpen(mmioFOURCC('V', 'I', 'D', 'C'), mmioFOURCC('M', 'S', 'V', 'C'), ICMODE_QUERY);
    auto QueryResult = ICCompressQuery(HIC, &FrameInfo, nullptr);
    wcscpy_s(StreamInfo.szName, L"TEST Compress Video Stream");

    StreamInfo.fccType = streamtypeVIDEO;
    StreamInfo.fccHandler = mmioFOURCC('M', 'S', 'V', 'C');
    StreamInfo.dwScale = 100000;
    StreamInfo.dwRate = 12500;
    StreamInfo.dwQuality = 8000;
    StreamInfo.dwSuggestedBufferSize = FrameInfo.bmiHeader.biSizeImage;
    SetRect(&StreamInfo.rcFrame, 0, 0, FrameInfo.bmiHeader.biWidth, FrameInfo.bmiHeader.biHeight);

    auto CreateStreamResult = AVIFileCreateStream(AviFile, &Stream, &StreamInfo);

    AVICOMPRESSOPTIONS CompressOption;
    ZeroMemory(&CompressOption, sizeof(AVICOMPRESSOPTIONS));
    CompressOption.fccType = streamtypeVIDEO;
    CompressOption.fccHandler = StreamInfo.fccHandler;
    //CompressOption.dwKeyFrameEvery = 1;
    CompressOption.dwQuality = 8000;
    CompressOption.dwFlags = AVICOMPRESSF_VALID;

    auto MakeCompressStreamResult = AVIMakeCompressedStream(&CompressedStream, Stream, &CompressOption, nullptr);
    auto SetFormatResult = AVIStreamSetFormat(CompressedStream, 0, &FrameInfo.bmiHeader, FrameInfo.bmiHeader.biSize);


Does anyone know why the last frame cannot be played correctly?

Thanks for reading.

Best Regards,

Chen


Viewing all articles
Browse latest Browse all 1079

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>