基于ffmpeg网络播放器的教程和总结.docx

基于ffmpeg网络播放器的教程和总结.docx

  1. 1、本文档共30页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
基于ffmpeg网络播放器的教程和总结

基于ffmpeg网络播放器的教程与总结 一、???????? 概述 为了解决在线无广告播放youku网上的视频。(youku把每个视频切换成若干个小视频)。 视频资源解析可以从 HYPERLINK / 网上获取,此网站根据你输入的优酷的播放网页地址解析成若干个真实的视频地址。 二、???????? 实现 首先搜索关闭网络播放器(流媒体播放器的实现方法) 得出的结论,目前主流的播放器分三大阵营微软,苹果,基于FFmpeg内核的。所以我决定从ffmpeg开源的播放器入手。 最出名的ffmpeg播放器vcl播放器,开源免费。最后选择放弃。 原因 1 依赖于vcl的68M的plugins和libvlccore.dll,libvlc.dll项目生成文件过大。 2即使这样不能解决播放多段视频卡顿现象。 ? 最后决定使用ffmpeg官方的ffpaly播放器只有1000多行 (很激动),使用ffmpeg编解码,使用sdl做显示。本想只修改下就行了。结果发现里面代码结构过于复杂,搞懂每行很是吃力。而且是用sdl做显示,sdl需要句柄。而我这个是为wpf项目量身定做的。Wpf只有顶层窗口有句柄。如果是使用wpf嵌入winform控件。导致此winform控件只能最上层显示(原因是wpf是directui思想实现的)。所以也放弃了。 ? 决定使用ffmpeg库,自己开发 查看 HYPERLINK / 网上关于ffmpeg开发的总结。对ffmpeg开发有个总体方向。 ? 首先我们先把视频搞出来,参考 HYPERLINK / 网上? 100行代码搞定视频。 然后100行搞定音频 HYPERLINK / 网上? 这样视频音频都已经搞出来了。但是我们怎么把视频音频一起搞出来呢? ? Csdn有一份文档 HYPERLINK / 网上 此文档介绍了用ffmpeg开发视频播放器的详细方法,有注解。但是已经过时了。最新的代码在 HYPERLINK / 网上 但是文档中的思想还是挺受用的。代码不同,思想是通的。 结论,视频包含视频流,音频流,字幕流(一般没有), 音视频同步跟进播放时间戳pts来做的。 视频和音频得出pts的方式有所不同。具体看文档。 ? 如果按文档的注释,然后根据github的代码,编译我们发现视频可以显示,音频出现乌拉乌拉的杂音。 此时我参考100行搞定音频 HYPERLINK / 网上 源码修改了github的音频部分。调试运行,可以播放了。 ? ? 至此 我们的视频播放器可以播放了 ,使用sdl做显示。那现在我们还是没解决问题。网络播放器,多段无卡顿。 在此基础上我们分析,可以开辟一个线程从网络上下载视频,音频,放入到缓冲队列。音视频播放线程从缓冲区读取数据解析。 这就是网络播放器的原理,而且不会卡顿。其中音视频同步用音频驱动视频的方式实现。显示目前暂用sdl。 ? ? 经过上面这些,我们的网络播放器终于可以工作了。那现在只剩下一个wpf句柄问题了。 好在我看到了 HYPERLINK / 网上 文章里面介绍了vlc播放器c#开源代码,可以使用共享内存。但是说的不够详细 这两个开源项目都是用共享内存实现的。 参考此两篇文章。我的播放器终于可以播放网络的视频,音频,然后才wpf播放了。 中间有wpf调用c方法的一些细节。 至此我们的问题真的解决了吗? ? ? NO,因为我们回调函数调用共享内存显示,里面有很多问题,比如当我们关闭程序时会出现访问锁定内存等问题。此问题肯定是可以解决的。但是我们东拼西凑把问题解决了。 当此方案不是最好的。 这3篇文章介绍了怎么使用mediaelement完美解决播放视频问题。 播放器源码可以用 HYPERLINK / 网上 下面是我的播放器c部分的代码 /* 本播放器主要是解决 从优酷上播放视频。 是有多段网络视频组成一个完整视频。 解决方案,开辟两个线程,一个线程从网络中读取数据包放入缓冲池(视频缓冲池和音频缓冲池) 一个线程从音频缓冲池读取数据播放。一个从视频缓冲池中读取播放. ? 难点1:av_read_frame是读取packet(包) 数据, 几包数据 组成avframe(帧) 音频帧转换成byte[] 存储起来 放入缓冲池 吃音频byte[]可以直接放入音频流中播放 视频帧也是byte[]? 存储起来,此视频byte[]数组可以转换为图片 PIX_FMT_RGB24 为了同步音视频,我们把没帧的最后一包的pts记录下来放入缓冲区 ? */ #include stdafx.h #include BonkerPlayer.h #include stdio.h #include stdlib.h #include string.h extern?C { #include libavcodec/avcode

文档评论(0)

jyf123 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:6153235235000003

1亿VIP精品文档

相关文档