/// <summary> /// 使用解码库确定流真正的格式 /// </summary> /// <param name="demuxer"></param> /// <returns></returns> public abstract bool Open(AbstractAVDemuxer demuxer);
public override bool Open(AbstractAVDemuxer demuxer) { #region 初始化mpg123句柄 int error; if ((this.mpg123Handle = mpg123.mpg123_new(IntPtr.Zero, out error)) == IntPtr.Zero) { logger.ErrorFormat("mpg123_new失败, {0}", error); return(false); } if ((error = mpg123.mpg123_open_feed(this.mpg123Handle)) != mpg123.MPG123_OK) { logger.ErrorFormat("mpg123_open_feed失败, {0}", error); return(false); } #endregion #region 探测流格式 IntPtr container_hdr_ptr = Marshal.UnsafeAddrOfPinnedArrayElement(demuxer.ContainerHeader, 0); if ((error = mpg123.mpg123_feed(this.mpg123Handle, container_hdr_ptr, demuxer.ContainerHeader.Length)) != mpg123.MPG123_OK) { logger.ErrorFormat("mpg123_feed ContainerHeader失败, {0}", error); return(false); } /* 如果当前没有解析数据帧,则读取一帧数据 */ AudioDemuxPacket packet = null; if (demuxer.CurrentPacket == null) { if (!demuxer.DemuxNextPacket <AudioDemuxPacket>(out packet)) { logger.ErrorFormat("NextPacket失败"); return(false); } } int total_probe_times = 0; int rate, channel, encoding; do { IntPtr frameptr = Marshal.UnsafeAddrOfPinnedArrayElement(packet.Data, 0); if ((error = mpg123.mpg123_feed(this.mpg123Handle, frameptr, packet.Data.Length)) != mpg123.MPG123_OK) { logger.ErrorFormat("feed数据失败, {0}", error); return(false); } if (total_probe_times++ > MAX_PROBE_TIMES) { logger.ErrorFormat("Open超时"); return(false); } }while ((error = mpg123.mpg123_getformat(this.mpg123Handle, out rate, out channel, out encoding)) != mpg123.MPG123_OK); logger.InfoFormat("OpenDemuxer成功, rate={0}, channel={1}, encoding={2}", rate, channel, encoding); #endregion this.demuxer = demuxer; return(true); }