Android HTTP边下边播

本文简单地分享一下在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转移到文件头部,从而支持边下载边播放。

ffmpeg -i input.mp4 -movflags faststart output.mp4

(2)如果自己通过http GET请求边下载边解码播放的话,则需要注意,音视频数据的实时传输显示与普通文件的传输有很大的不同,接收到文件数据流可以立马写磁盘,但是接收到一帧音视频数据则必须根据时间戳来决定何时送入解码器解码以及显示,没到时间,就得sleep,否则的话,播放过程会因为网络抖动而出现卡顿现象。

注:一般情况下,两帧视频的时间间隔 = 1000/帧率

5. 小结

关于Android中做HTTP边下边播的一些经验就分享到这里了,有任何疑问或者建议欢迎留言或者来信[email protected]交流,或者关注我的新浪微博 @卢_俊 获取最新的文章和资讯。

时间: 2024-07-30 09:08:06

Android HTTP边下边播的相关文章

修改迅雷下载中“边下边播”的默认播放器

相信大家都对迅雷的边下边播有一定的了解,正常情况下都默认的播放器的迅雷看看,但是它的播放器存在的问题相信大家也有一定的了解:话不多说,开始! 先看看修改之前的图: 教程开始: 第一步,找到你的迅雷安装路径,例如我的,注意我标红的路径: 第二步,新建一个叫"xmp.ini"的空文件,然后用记事本或者其他文本编辑软件打开,将以下代码复制进去:其中"D:\PotPlayer\PotPlayerMini.exe"是你自己想要的播放器的安装位置. [global] Path=

仿微博视频边下边播之滑动TableView自动播放-b

Tips:这次的内容分为两篇文章讲述01.[iOS]仿微博视频边下边播之封装播放器 讲述如何封装一个实现了边下边播并且缓存的视频播放器.02.[iOS]仿微博视频边下边播之滑动TableView自动播放 讲述如何实现在tableView中滑动播放视频,并且是流畅,不阻塞线程,没有任何卡顿的实现滑动播放视频.同时也将讲述当tableView滚动时,以什么样的策略,来确定究竟哪一个cell应该播放视频. 上篇文章讲述了封装一个边下边播,并且带有缓存功能的播放器.如果你还没有看,请点击跳转[iOS]仿

iOS视频边下边播--缓存播放数据流

实现视频边下边播,这里的边下边播不是单独开一个子线程去下载,而是把视频播放的数据给保存到本地.简而言之,就是使用一遍的流量,既播放了视频,也保存了视频. 用到的框架:<AVFoundation/AVFoundation.h> 用到的播放器:AVplayer 先说一下avplayer自身的播放原理,当我们给播放器设置好url等一些参数后,播放器就会向url所在的服务器发送请求(请求参数有两个值,一个是offset偏移量,另一个是length长度,其实就相当于NSRange一样),服务器就根据ra

Android对UDP组播接收数据的有限支持(一)

最近,想做一个跨平台的局域网的文件传输软件,思路是组播设备信息,TCP连接传输文件.于是进行了一次简单的UDP组播测试,发现Android对于UDP组播接收数据的支持即极为有限. 部分代码如下 1 package com.hsocket.Udp; 2 3 import java.io.IOException; 4 import java.net.DatagramPacket; 5 import java.net.DatagramSocket; 6 7 public class UdpReceiv

Android自学笔记-17-广播接收者(BroadcastReceiver)

下载地址: http://pan.baidu.com/s/1pJ2lWYB Android自学笔记-17-广播接收者(BroadcastReceiver),码迷,mamicode.com

Android无限广告轮播 - 自定义BannerView

1.概述 这其实是我第一篇想写的博客,可能是因为我遇到了太多的坑,那个时候刚入行下了很多Demo发现怎么也改不动,可能是能力有限,这次就做一个具体的实现和彻底的封装. 上次讲了Android无限广告轮播-ViewPager源码分析,有了源码分析我们对ViewPager就有了一个大概的了解,那么再来封装成自定义View,就会简单许多,附视频讲解地址:http://pan.baidu.com/s/1bpqqkGn 2.效果封装 2.1 自定义BannerViewPager extends ViewP

视频播放器边下边播(保存到沙盒,显示进度)

没怎么研究视频播放器,就在网上找了个,链接:https://github.com/835239104/KrVideoPlayerPlus 下载AFNetworking, 1.下载最新版的会报错,没有引入相关库 2.AFSecurityPolicy.m中:注释了一部分代码 #pragma mark - 这里改了 ------ #warning - 这里改了 -------- //#if !TARGET_OS_IOS && !TARGET_OS_WATCH //static NSData *

Android的图片轮播和滑动

用ViewFipper来实现 MainActivity 1 package viewflipper.example.administrator.viewfipper; 2 3 import android.app.Activity; 4 import android.support.v7.app.AppCompatActivity; 5 import android.os.Bundle; 6 import android.view.MotionEvent; 7 import android.wi

Android自定义控件之轮播图控件

背景 最近要做一个轮播图的效果,网上看了几篇文章,基本上都能找到实现,效果还挺不错,但是在写的时候感觉每次都要单独去重新在Activity里写一堆代码.于是自己封装了一下.本篇轮播图实现原理原文出处:循环广告位组件的实现,这里只是做了下封装成一个控件,不必每次重复写代码了. 效果图 实现分析 轮播图的功能就是实现左右滑动的广告.图片信息展示,那我们就用ViewPager来实现,由于考虑到用户体验,我们还需要在下面加一个指示器来标示滑动到了第几张轮播图.指示器我们可以用一个线性布局来根据要展示的轮