在使用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