查看: 4807|回复: 12

osgmovie的问题

[复制链接]

该用户从未签到

发表于 2011-2-28 08:50:21 | 显示全部楼层 |阅读模式
本帖最后由 neillyang 于 2011-2-28 09:35 编辑

编写视频播放器的时候遇到的问题,按osgmovie编写的。在AVI格式时没有问题,如果不停的打开其他格式的文件时会出现内存错误。


好像是其他格式的文件要解压缩,然后分配内存预存一部分的事先解压缩出来的帧。特别是调声音的时候,osgmovie的例子里运行也会出现该问题。

用的是ffmpeg的插件。

求各位大神帮忙。

该用户从未签到

发表于 2011-2-28 13:44:58 | 显示全部楼层
能否给出您出现问题的代码?

该用户从未签到

 楼主| 发表于 2011-3-1 08:13:12 | 显示全部楼层
回复 2# array


    今天要搬家,代码没拷回来,明天发给您吧。出错就是在imagestream::audiostream,声音回调那块,关闭音频就好了,提示的是绑定消息队列出错。重新生成最新的ffmpeg能解决该问题么?

该用户从未签到

 楼主| 发表于 2011-3-2 10:16:48 | 显示全部楼层
本帖最后由 neillyang 于 2011-3-2 10:23 编辑

回复 2# array



osg::ImageStream::AudioStreams& audioStreams = videostream->getAudioStreams();
        if (!audioStreams.empty() && (audioStream == 0))
        {
             audioStream = audioStreams[0].get();
             audioStream->setAudioSink(new SDLAudioSink(audioStream));

        }


问题就在这块,注释掉这块就没问题,但是也没声音了不是

上述相关联的部分如下:
//SDLAudioSink
static void soundReadCallback(void * user_data, uint8_t * data, int datalen)
{
    SDLAudioSink * sink = reinterpret_cast<SDLAudioSink*>(user_data);
    osg::ref_ptr<osg::AudioStream> as = sink->_audioStream.get();
    if (as.valid())
        as->consumeAudioBuffer(data, datalen);
}

SDLAudioSink::~SDLAudioSink()
{
    stop();
}

void SDLAudioSink::play()
{
    if (_started)
    {
        if (_paused)
        {
            SDL_PauseAudio(0);
            _paused = false;
        }
        return;
    }

    _started = true;
    _paused = false;

    SDL_AudioSpec specs = { 0 };
    SDL_AudioSpec wanted_specs = { 0 };

    wanted_specs.freq = _audioStream->audioFrequency();
    wanted_specs.format = AUDIO_S16SYS;
    wanted_specs.channels = _audioStream->audioNbChannels();
    wanted_specs.silence = 0;
    wanted_specs.samples = 1024;
    wanted_specs.callback = soundReadCallback;
    wanted_specs.userdata = this;

    if (SDL_OpenAudio(&wanted_specs, &specs) < 0)
        return;
    SDL_PauseAudio(0);
}

void SDLAudioSink::pause()
{
    if (_started)
    {
        SDL_PauseAudio(1);
        _paused = true;
    }
}

void SDLAudioSink::stop()
{
    if (_started)
    {
        if (!_paused) SDL_PauseAudio(1);
        SDL_CloseAudio();
    }
}

该用户从未签到

发表于 2011-3-2 12:08:08 | 显示全部楼层
能否给出您用来测试的代码,这样我才可能评判这是否是一个潜在的内部错误并且提交更改。我用osgmovie并没有什么问题

该用户从未签到

 楼主| 发表于 2011-3-2 14:32:40 | 显示全部楼层
用osgmovie不关闭连续打开几次非AVI文件时会产生类似内存错误。你可以试一下,我的版本是2.9.9。代码的话就是第一段的那部分,注释掉就好了,出错就在声音那块。

该用户从未签到

 楼主| 发表于 2011-3-5 11:06:52 | 显示全部楼层
能否帮忙给出ffmpeg插件、osg::imagestream、osg::videostream调用时的关闭部分,我的可能是析构部分没有释放干净。但是检测时还是找不出问题所在。

该用户从未签到

发表于 2011-3-7 08:43:15 | 显示全部楼层
您可以直接查看这个插件的源代码

该用户从未签到

发表于 2011-3-7 08:45:43 | 显示全部楼层
用osgmovie不关闭连续打开几次非AVI文件时会产生类似内存错误。你可以试一下,我的版本是2.9.9。代码的话就 ...
neillyang 发表于 2011-3-2 14:32



您是如何做到“不关闭连续打开几次”的,请给出相关的代码

该用户从未签到

 楼主| 发表于 2011-3-7 09:08:07 | 显示全部楼层
就是在命令窗口一直调用-e ffmpeg 打开文件。

该用户从未签到

 楼主| 发表于 2011-3-7 09:10:41 | 显示全部楼层
问题总是出在BoundedMessageQueue           ScopedLock

该用户从未签到

发表于 2011-3-7 10:28:14 | 显示全部楼层
我在命令窗口反复调用osgmovie -e ffmpeg xxx.wmv(xxx是三个不同的媒体文件),试验了大概20次左右,没有任何问题

该用户从未签到

发表于 2016-11-28 15:40:42 | 显示全部楼层
你好,你这个问题最终解决了么?
我现在也是这问题,开启播放声音后,退出的时候,Win32Thread.cpp中if( WaitForSingleObject(pd->tid.get(),INFINITE) != WAIT_OBJECT_0)这句代码执行崩溃。
debug和relase都是这问题,其中relase偶尔还报“堆栈 Cookie 检测代码检测到基于堆栈的缓冲区溢出”这个错误。
急啊,能否指点一二。
qq:545792476
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表