Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 4.0 如何获得给定h264流(Silverlight)的准确持续时间?_C# 4.0_Silverlight 4.0_H.264 - Fatal编程技术网

C# 4.0 如何获得给定h264流(Silverlight)的准确持续时间?

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解

背景: 我使用ffmpeg对原始h264文件进行了编码。我正在尝试创建我自己的容器,就像平滑流处理如何处理碎片化的mp4容器一样。我对smooth stream的安全性不满意,因为任何人都可以通过适当的身份验证从IIS中完全删除文件

问题
无论如何,我在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值来结束运行