分享一个自己写的FLV分离器

lim****ing UID.0
2015-04-04 发表

使用这个库可以在原生不支持播放FLV的MediaElement控件上播放FLV视频。

这个库以简单易用为设计目标,假设我们有一个MediaElement控件,将其命名为mediaElement,并且在应用的安装目录下Assets文件夹中存在test.flv。
使用这个库播放test.flv只需要写下面数行代码。

[mw_shl_code=csharp,true]var applicationFolder = Windows.ApplicationModel.Package.Current.InstalledLocation;
var storageFile = await applicationFolder.GetFileAsync("Assets\\test.flv");
var randomAccessStream = await storageFile.OpenReadAsync();
mediaElement.SetSource(FlvMediaStreamSource.Wrap(randomAccessStream));
mediaElement.Play();[/mw_shl_code]

这个库开放了全部源代码,并且带有一个简单的演示程序。
源代码地址:github.com/lxrite/DawnPlayer
目前仅支持Windows Phone Silverlight应用,之后会增加WinRT的支持。

标签: 分离器

敬告:
为防止不可控的内容风险,本站已关闭新用户注册,新贴的发表及评论;
你现在看到的内容只是互联网用户曾经发表的言论快照,仅用于老用户留存纪念,且仅与科技行业相关,全部内容不代表本站观点及立场;
本站重新开放前已针对包括用户隐私、版权保护、信息安全、国家政策在内的各种互联网法律法规要求,执行了隐患内容的自查、屏蔽和删除;
本站目前所属个人主体,未有任何盈利安排与计划,且与原WFUN.COM所属公司不存在任何关联关系;
如果本帖内容或者相关资源侵犯到您的合法权益,或者您认为存在问题,那么请您务必点此举报或投诉!
全部回复:
fairybee UID.891324
2015-04-04 回复

哎呦,不辍哦。

qiqiminmin UID.638527
2015-04-04 回复

非常感谢分享。

不过winrt,你必须面对
[1] 缺少MediaSampleAttributeKeys, MediaStreamDescription
[2] 您也在不能包一个wp8.1 rt的库了,因为MediaStreamSource已经是sealed了

wcavell UID.34926
2015-04-04 回复

Quote***链接停止解析***
非常感谢分享。

不过winrt,你必须面对


{:5_194:} 缺少也没有关系的
winrt 就包含了AudioEncodingProperties 和VideoEncodingProperties
只需要把媒体信息设置一下,就跟sl的处理上差不多。
处理上不一定要继承MediaStreamSource。

qiqiminmin UID.638527
2015-04-04 回复

本帖最后由 qiqiminmin 于 2015-4-4 11:02 编辑

Quote***链接停止解析***
缺少也没有关系的
winrt 就包含了AudioEncodingProperties 和VideoEncodingProperties
只需要 ...


那就好。{:6_230:}, 期待中,

,有个open source windows phone stream media 是支持的。 还好我自己没有flv这方面的需求..

wcavell UID.34926
2015-04-04 回复

感谢楼主的分享,请问一下,如果是http的文件,如何直接播放,而不是下载完了再播放。

vbfool UID.352791
2015-04-04 回复

Quote***链接停止解析***
感谢楼主的分享,请问一下,如果是http的文件,如何直接播放,而不是下载完了再播放。 ...


也是用MediaStreamSource,边下边解析去填充。

wcavell UID.34926
2015-04-04 回复

Quote***链接停止解析***
也是用MediaStreamSource,边下边解析去填充。


脑细胞就是死在这上面,不过用了别人写的MediaFoundation,感觉很不错,就部分视频(爱奇艺的flv)解码失败。

qiqiminmin UID.638527
2015-04-04 回复

本帖最后由 qiqiminmin 于 2015-4-4 11:22 编辑

Quote***链接停止解析***
感谢楼主的分享,请问一下,如果是http的文件,如何直接播放,而不是下载完了再播放。 ...


每次获取sample的时候进行处理,

winls:
protected override async void GetSampleAsync(MediaStreamType mediaStreamType)

winrt:
void _mss_SampleRequested(Windows.Media.Core.MediaStreamSource sender, MediaStreamSourceSampleRequestedEventArgs args)
{

}

void _mss_Starting(Windows.Media.Core.MediaStreamSource sender, MediaStreamSourceStartingEventArgs args)
{
.Initialize(_mss, _videoDesc);
args.Request.SetActualStartPosition(new TimeSpan(0));
}

.叫無鈳取玳. UID.121651
2015-04-04 回复

不明觉历***附件停止解析***

lim****ing UID.1032098
2015-04-04 回复

Quote***链接停止解析***
非常感谢分享。

不过winrt,你必须面对


WinRT我还没试过,不过可以确定是有类似的机制的,就像楼下说的那样。

lim****ing UID.1032098
2015-04-04 回复

Quote***链接停止解析***
感谢开源,看了下大部分代码都是纯C++,复用性还不错。




1.时长这个刚才试了下确实不是必须的,之后会移除这个判断;

2.这个分离器之后也会增加建立keyframes obj的。
目前要求必须要有keyframes才能seek主要是因为从在线视频网站下载的flv都是有keyframes的。

3.好,获取视频的宽高就按你说的这个方法做。

4.这65536是单次从stream中读取数据的最大大小,如果读取的数据太短的话会将其先保存到read_buffer然后继续再读。

5.
由于我不是搞视频解码和播放的所以我对这方便不是很了解,我是刚才上网搜了下才知道DTS、PTS和CTS这些概念的。
从网上搜索到的信息似乎 PTS = DTS + CTS

原本在video_sample::time_stamp中应该要保存的是PTS(因为这个最后是作为ReportGetSampleCompleted的参数的),但是似乎我保存成DTS了(因为没有加CTS)

另外sample需要暴露DTS是因为 sample的解码顺序和它出现在文件中的顺序可能不一致吗?

最后,感谢你阅读我的代码并提出这些建议。

lim****ing UID.1032098
2015-04-04 回复

Quote***链接停止解析***
感谢楼主的分享,请问一下,如果是http的文件,如何直接播放,而不是下载完了再播放。 ...


我之前的做法是将Http文件封装成一个实现IRandomAccessStream接口的对象。

本站使用Golang构建,点击此处申请开源鄂ICP备18029942号-4联系站长投诉/举报