C# 4.0 如何获得给定h264流(Silverlight)的准确持续时间?
背景: 我使用ffmpeg对原始h264文件进行了编码。我正在尝试创建我自己的容器,就像平滑流处理如何处理碎片化的mp4容器一样。我对smooth stream的安全性不满意,因为任何人都可以通过适当的身份验证从IIS中完全删除文件 问题C# 4.0 如何获得给定h264流(Silverlight)的准确持续时间?,c#-4.0,silverlight-4.0,h.264,C# 4.0,Silverlight 4.0,H.264,背景: 我使用ffmpeg对原始h264文件进行了编码。我正在尝试创建我自己的容器,就像平滑流处理如何处理碎片化的mp4容器一样。我对smooth stream的安全性不满意,因为任何人都可以通过适当的身份验证从IIS中完全删除文件 问题 无论如何,我在Silverlight中使用MediaStreamSource并启用ssl时,我的原始h264流播放“有点”正常工作,但我无法正确获取从服务器端发送到Silverlight客户端中MediaStreamSource的卡盘的时间戳。sps NAL解
无论如何,我在Silverlight中使用MediaStreamSource并启用ssl时,我的原始h264流播放“有点”正常工作,但我无法正确获取从服务器端发送到Silverlight客户端中MediaStreamSource的卡盘的时间戳。sps NAL解析的h264数据块之间存在延迟。我看到了一个持续时间。想知道是否有一种简单的方法来计算h264流中的帧并获得持续时间,这样我就可以向MediaSampleSource传递准确的时间戳。如果有人可以:给我指出一个开源框架计数器的方向,或者给我一些解析框架的伪代码(可能是一些十六进制解析技巧)。或者也许有人对这个问题有一些经验,这将是非常好的。任何帮助都将不胜感激。提前谢谢 我翻阅了ISO 14496-10文档,找到了一些十六进制字符串,用于在原始h264流中查找帧: 0x00000141, 0x00000101, 0x00000165 如果您遍历流并计算这些十六进制字符串,以及使用ffmpeg和libx264进行编码,那么您应该会得到一个非常可靠的帧计数。(如果我错了,请有人纠正我)。因此,如果您有h264视频的总持续时间,并且您有可以从ffmpeg轻松获得的FPS,那么您可以使用在传递到MediaStreamSource的任何给定数据块中计算的帧数,为您的MediaSampleSource获得非常准确的时间戳。希望这能帮助一些人,因为前几天晚上我的播放很混乱,这让我很沮丧 编辑
当我在directshow中测试我的播放功能时,我注意到这并不完美,只适用于使用ffmpeg的简单编码h264流。h264具有可变的帧率和比特率。虽然视频运行非常平稳,但敏锐的眼睛可以看到,在视频中更复杂的序列中,计时有点尴尬。我认为对于一个粗糙的视频流播放器来说,这是一个很好的方法,特别是如果经常使用关键帧。我想在单击“回答”之前添加这个是公平的。这实际上有点像兔子洞。从ISO 14496第10部分开始,并转至第7.3节了解语法 第一种近似方法是使用vui_参数中的字段速率(刻度/时间刻度中的num_units_)和切片头数() 如果您处理的是高清内容,并且编码器对每幅图片使用多个slice_header()s(那么您必须先检查_slice==0中的_mb_),则会出现这种情况 您必须注意frame_mbs_only_标志和field_pic_标志 另一个问题是表D-1,它解释pic_定时SEI消息的pic_结构字段。这包括字段重复(TBT或BTB)、帧倍增和帧倍增 如果您有一个传输流,您可以通过检查第一个和最后一个访问单元的PES头(ISO 13818第1部分)上的DTS值来结束运行