Android HTTP边下边播

news/2024/6/3 18:11:14 标签: 移动开发, ffmpeg, python

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

本文简单地分享一下在Android平台做HTTP边下载边播放的一些经验,希望对初学者有所帮助。 1. 为什么播放器在播放视频文件的时候,都知道该怎么去解码、该以怎样的时间间隔去显示每一帧呢? 因为无论是mp4、avi、flv、mkv还是其他格式的音视频文件,都存在一个称为metadata的数据块,记录了当前文件的图像尺寸、编码格式、帧率、码率等信息,播放器可以通过解析metadata得到这些信息。 2. 迅雷边下边播的原理是怎样的? 迅雷在边下边播的时候,不会像往常一样根据资源链接数优先排序进行乱序下载,而是会首先去下载含有metedata的数据块,从而配置好解码器和显示间隔等逻辑,然后保证至少有一个线程顺序地获取/下载即将播放的数据块,从而实现边下边播。 3. Android中如何实现边下边播? Android的VideoView是支持http协议的边下边播的,只需要将远程http服务器上的视频文件的HTTP URL地址通过 VideoView.setVideoPath 传进去,start之后VideoView就会直接边下载边解码播放了。 不过VideoView支持的视频格式有限,一般只支持mp4、3gp、avi格式 因此,你也可以直接通过"HTTP GET"请求进行文件下载,得到文件的metedata之后,解析出该文件的编码、帧率等信息(例如:mp4码流的话,可以通过《Android中如何提取和生成mp4文件》这篇文章提供的方法进行音视频数据的解耦),然后边下载边送入软/硬解码器进行解码,最后通过SurfaceView将解码后的数据显示出来,比较复杂,相当于自己做流媒体播放器了。 4. 需要注意的坑 (1) 不是所有的mp4文件都支持通过HTTP协议边下边播,因为有的mp4文件的metadata数据块在文件尾部,只有下载完整个文件之后才能成功解析。 注:对于metadata数据块在文件尾部的mp4文件,可以通过ffmpeg的qt-faststart工具来转换,或者直接使用如下ffmpeg命令将metadata转移到文件头部,从而支持边下载边播放。 1 ffmpeg -i input.mp4 -movflags faststart output.mp4 (2)如果自己通过http GET请求边下载边解码播放的话,则需要注意,音视频数据的实时传输显示与普通文件的传输有很大的不同,接收到文件数据流可以立马写磁盘,但是接收到一帧音视频数据则必须根据时间戳来决定何时送入解码器解码以及显示,没到时间,就得sleep,否则的话,播放过程会因为网络抖动而出现卡顿现象。 1 注:一般情况下,两帧视频的时间间隔 = 1000/帧率 5. 小结 关于Android中做HTTP边下边播的一些经验就分享到这里了,有任何疑问或者建议欢迎留言或者来信lujun.hust@gmail.com交流 在这里我们使用了bootstrapValidator,语法很简单,就不解释了。 结束语 免费学习更多精品课程,登录乐搏学院官网http://h.learnbo.cn/ 或关注我们的官方微博微信,还有更多惊喜哦~ 本文出自 “Jhuster的专栏” 博客,请务必保留此出处http://ticktick.blog.51cto.com/823160/1713220

转载于:https://my.oschina.net/learnbo/blog/783184


http://www.niftyadmin.cn/n/997776.html

相关文章

基于Deep Learning 的视频识别方法概览

深度学习在最近十来年特别火,几乎是带动AI浪潮的最大贡献者。互联网视频在最近几年也特别火,短视频、视频直播等各种新型UGC模式牢牢抓住了用户的消费心里,成为互联网吸金的又一利器。当这两个火碰在一起,会产生什么样的化学反应呢…

面壁人VS智子 --- 搜索排序的作弊和反作弊

搜索引擎已经是目前网络流量最大入口,在大搜上,基本上大家打开网页做的第一件事情就是打开一个搜索引擎,然后键入你感兴趣的内容,然后开始浏览。如果是个电商的网站,你打开以后,基本上也是直接键入你感兴趣…

Android自定义View,View中的原点坐标相关问题

我们自定义了View,但是有没想过一个问题,就是View中的(0,0)坐标,也就是原点坐标在哪??我们是不是有时候很困惑,接下来我们就来研究View中的原点坐标相关的问题。 一、new HelloView时View的原点 我们通过从…

Android开发面试题(一)

1、String和StringBuffer有什么本质区别? 本质区别:String字符串不可变,每次修改字符串必须要重新赋值(生成新的对象)才能修改;StringBuffer字符串可变,可以直接对字符串本身进行修改&#xff0…

Android特效 五种Toast详解

Toast是Android中用来显示显示信息的一种机制,和Dialog不一样的是,Toast是没有焦点的,而且Toast显示的时间有限,过一定的时间就会自动消失。 1.默认效果: 代码:Toast.makeText(getApplicationContext(), "默认Toast样式&quo…

人工智能与深度学习

人工智能的关键是机器学习,机器学习的突破是深度学习,人工神经网络。 1956年,在达特茅斯会议(Dartmouth Conferences)上,计算机科学家首次提出了“AI”术语,AI由此诞生,在随后的日子…

test_markdown

add modifications 非科学计数法显示数字 citation1 format bank% do not use scientific expression format long% use long double format format short% use short double format 1.list equation in left\(\pix^2\pi\) 2.list equation in middle\[xy^2\gamma\] 3.example\…

centos6.5安装python3

2019独角兽企业重金招聘Python工程师标准>>> Python3下载地址: http://www.python.org/ftp/python/3.3.4/Python-3.3.4.tgz 1、将Python-3.3.4.tgz移至 /usr/目录下 sudo cp Python-3.3.4.tgz /usr/ 2、先进入/usr/目录,然后解压压缩包 cd /u…