libvlc 打开较大MP4文件,关闭慢的问题.

在使用libvlc播放mp4 调用libvlc_media_player_stop导致程序卡死,其实等待一段时间恢复. 通过跟踪代码发现.这个过程主要时间是花费在 MP4_TrackDestroy这个函数中,

 当mp4文件较大时: p_track->i_chunk_count 间数值较大,正常可以>100000 ,而这个循环内都是针对内存操作. 导致这个for循环花费很多时

static void MP4_TrackDestroy( mp4_track_t *p_track )
{
    unsigned int i_chunk;

    p_track->b_enable   = false;
    p_track->b_ok = false;
    es_format_Clean( &p_track->fmt );
    p_track->b_selected = false;


    for( i_chunk = 0; i_chunk < p_track->i_chunk_count; i_chunk++ )
    {
        if( p_track->chunk )
        {
           FREENULL(p_track->chunk[i_chunk].p_sample_delta_dts );
           FREENULL(p_track->chunk[i_chunk].p_sample_count_dts);

           FREENULL(p_track->chunk[i_chunk].p_sample_offset_pts );
           FREENULL(p_track->chunk[i_chunk].p_sample_count_pts);
        }
    }
    FREENULL( p_track->chunk );
    if( !p_track->i_sample_size )
    if( p_track->cchunk ) {
        FreeAndResetChunk( p_track->cchunk );
        FREENULL( p_track->cchunk );
    }

    {
}
        FREENULL( p_track->p_sample_size );
    }

 
修复方法1: 
  libvlc 对mp4文件用的是自己实现的 MP4 这个demux , (而这个实现的版本中,对于大文件关闭太过耗时),需要修改MP4文件的demux 为ffmpeg的实现 (ff_mov_demuxer ) ,vlc系统中对于自己实现的demux 设置的优先级非常高,见代码(set_capability( "demux", 240 )). 所以最简单方式就是 :
  在程序开始通过传入参数的方式 强制指定demux 
    const char* vlcArgs[] = {   
       "--demux", "avformat"  
    }
   libvlc_new(sizeof(vlcArgs) / sizeof(vlcArgs[0]), vlcArgs);


 

修复方法2 :  (修复vlc代码 ,自行编译)

参考大佬的修改:

https://code.videolan.org/videolan/vlc/-/merge_requests/129

当前代码已经merge, 可见最新版本应该没有这个问题了.

 音视频qq群:  210324637

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值