请尊重分享成果,转载请注明出处,本文来自逆流的鱼yuiop,原文链接:
http://blog.csdn.net/hejjunlin/article/details/75305299

看下直播m3u8结构:

#EXTM3U
#EXT-X-MEDIA-SEQUENCE:3918
#EXT-X-TARGETDURATION:10
#EXTINF:10,
2017071806/1500358480.ts?type=hls_live_slice
#EXTINF:10,
2017071806/1500358490.ts?type=hls_live_slice
#EXTINF:10,
2017071806/1500358500.ts?type=hls_live_slice
#EXTINF:10,
2017071806/1500358510.ts?type=hls_live_slice
#EXTINF:10,
2017071806/1500358520.ts?type=hls_live_slice
#EXTINF:10,
2017071806/1500358535.ts?type=hls_live_slice
#EXTINF:10,
2017071806/1500358545.ts?type=hls_live_slice
#EXTINF:10,
2017071806/1500358555.ts?type=hls_live_slice
#EXTINF:10,
2017071806/1500358565.ts?type=hls_live_slice
#EXTINF:10,
2017071806/1500358575.ts?type=hls_live_slice

看下点播m3u8结构:

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-TARGETDURATION:19
#EXT-X-PLAYLIST-TYPE:VOD
#EXTINF:9.800,
00_d0024036a7j.320086.1.ts?index=0&start=0&end=9800&brs=0&bre=1509827&ver=4
#EXTINF:10.480,
01_d0024036a7j.320086.1.ts?index=1&start=9800&end=20280&brs=1509828&bre=3828055&ver=4
#EXTINF:9.960,
02_d0024036a7j.320086.1.ts?index=2&start=20280&end=30240&brs=3828056&bre=6248743&ver=4
#EXTINF:9.520,
03_d0024036a7j.320086.1.ts?index=3&start=30240&end=39760&brs=6248744&bre=8234399&ver=4
#EXTINF:9.920,
04_d0024036a7j.320086.1.ts?index=4&start=39760&end=49680&brs=8234400&bre=10619931&ver=4
#EXTINF:9.960,
05_d0024036a7j.320086.1.ts?index=5&start=49680&end=59640&brs=10619932&bre=13400639&ver=4
#EXTINF:9.720,
06_d0024036a7j.320086.1.ts?index=6&start=59640&end=69360&brs=13400640&bre=16777683&ver=4
#EXTINF:10.880,
07_d0024036a7j.320086.1.ts?index=7&start=69360&end=80240&brs=16777684&bre=19713867&ver=4
...省略
#EXTINF:9.960,
029_d0024036a7j.320086.2.ts?index=29&start=295520&end=305480&brs=0&bre=1287611&ver=4
#EXTINF:9.040,
...省略
#EXTINF:7.240,
0315_d0024036a7j.320086.11.ts?index=315&start=3181360&end=3188600&brs=30080752&bre=31204615&ver=4
#EXT-X-ENDLIST

区别:
1、 每个TS分片时间,通过标签EXTINF,后面有的是float型,有的是int型,一般为10s(也有不会10s的),最后如果没有10s,就取对应时间。
2、不是所有点播m3u8中都有EXT-X-PLAYLIST-TYPE,表明类型。最直接区分就是直播m3u8没有EXT-X-ENDLIST标签,因为是实时流,自然不会有结束,否则就是点播流了。

FFmpeg是如何解析直播,点播的HLS?在\libavformat\hlsproto.c中,就是实现步骤,先打开m3u8文件,然后parse。

static int hls_open(URLContext *h, const char *uri, int flags)
{HLSContext *s = h->priv_data;int ret, i;const char *nested_url;if (flags & AVIO_FLAG_WRITE)return AVERROR(ENOSYS);h->is_streamed = 1;if (av_strstart(uri, "hls+", &nested_url)) {av_strlcpy(s->playlisturl, nested_url, sizeof(s->playlisturl));} else if (av_strstart(uri, "hls://", &nested_url)) {av_log(h, AV_LOG_ERROR,"No nested protocol specified. Specify e.g. hls+http://%s\n",nested_url);ret = AVERROR(EINVAL);goto fail;} else {av_log(h, AV_LOG_ERROR, "Unsupported url %s\n", uri);ret = AVERROR(EINVAL);goto fail;}av_log(h, AV_LOG_WARNING,"Using the hls protocol is discouraged, please try using the ""hls demuxer instead. The hls demuxer should be more complete ""and work as well as the protocol implementation. (If not, ""please report it.) To use the demuxer, simply use %s as url.\n",s->playlisturl);if ((ret = parse_playlist(h, s->playlisturl)) < 0)goto fail;if (s->n_segments == 0 && s->n_variants > 0) {int max_bandwidth = 0, maxvar = -1;for (i = 0; i < s->n_variants; i++) {if (s->variants[i]->bandwidth > max_bandwidth || i == 0) {max_bandwidth = s->variants[i]->bandwidth;maxvar = i;}}av_strlcpy(s->playlisturl, s->variants[maxvar]->url,sizeof(s->playlisturl));if ((ret = parse_playlist(h, s->playlisturl)) < 0)goto fail;}if (s->n_segments == 0) {av_log(h, AV_LOG_WARNING, "Empty playlist\n");ret = AVERROR(EIO);goto fail;}s->cur_seq_no = s->start_seq_no;if (!s->finished && s->n_segments >= 3)s->cur_seq_no = s->start_seq_no + s->n_segments - 3;return 0;fail:hls_close(h);return ret;
}

解析playlist中的ts流

static int parse_playlist(URLContext *h, const char *url)
{HLSContext *s = h->priv_data;AVIOContext *in;int ret = 0, is_segment = 0, is_variant = 0, bandwidth = 0;int64_t duration = 0;char line[1024];const char *ptr;if ((ret = ffio_open_whitelist(&in, url, AVIO_FLAG_READ,&h->interrupt_callback, NULL,h->protocol_whitelist, h->protocol_blacklist)) < 0)return ret;read_chomp_line(in, line, sizeof(line));if (strcmp(line, "#EXTM3U")) {ret = AVERROR_INVALIDDATA;goto fail;}free_segment_list(s);s->finished = 0;while (!avio_feof(in)) {read_chomp_line(in, line, sizeof(line));if (av_strstart(line, "#EXT-X-STREAM-INF:", &ptr)) {struct variant_info info = {{0}};is_variant = 1;ff_parse_key_value(ptr, (ff_parse_key_val_cb) handle_variant_args,&info);bandwidth = atoi(info.bandwidth);} else if (av_strstart(line, "#EXT-X-TARGETDURATION:", &ptr)) {s->target_duration = atoi(ptr) * AV_TIME_BASE;} else if (av_strstart(line, "#EXT-X-MEDIA-SEQUENCE:", &ptr)) {s->start_seq_no = atoi(ptr);} else if (av_strstart(line, "#EXT-X-ENDLIST", &ptr)) {s->finished = 1;} else if (av_strstart(line, "#EXTINF:", &ptr)) {is_segment = 1;duration = atof(ptr) * AV_TIME_BASE;} else if (av_strstart(line, "#", NULL)) {continue;} else if (line[0]) {if (is_segment) {struct segment *seg = av_malloc(sizeof(struct segment));if (!seg) {ret = AVERROR(ENOMEM);goto fail;}seg->duration = duration;ff_make_absolute_url(seg->url, sizeof(seg->url), url, line);dynarray_add(&s->segments, &s->n_segments, seg);is_segment = 0;} else if (is_variant) {struct variant *var = av_malloc(sizeof(struct variant));if (!var) {ret = AVERROR(ENOMEM);goto fail;}var->bandwidth = bandwidth;ff_make_absolute_url(var->url, sizeof(var->url), url, line);dynarray_add(&s->variants, &s->n_variants, var);is_variant = 0;}}}s->last_load_time = av_gettime_relative();fail:avio_close(in);return ret;
}

第一时间获得博客更新提醒,以及更多android干货,源码分析,欢迎关注我的微信公众号,扫一扫下方二维码或者长按识别二维码,即可关注。

如果你觉得好,随手点赞,也是对笔者的肯定,也可以分享此公众号给你更多的人,原创不易

FFmpeg总结(十四)FFmpeg如何解析直播点播m3u8相关推荐

  1. 国科大学习资料--人工智能原理与算法-第十四次作业解析(学长整理)

    国科大学习资料–人工智能原理与算法-第十四次作业解析(张文生老师主讲)

  2. Android 音视频深入 十四 FFmpeg与OpenSL ES 播放mp3音乐,能暂停(附源码

    项目地址 https://github.com/979451341/FFmpegOpenslES 这次说的是FFmpeg解码mp3,数据给OpenSL ES播放,并且能够暂停. 1.创建引擎 slCr ...

  3. Android 音视频深入 十四 FFmpeg与OpenSL ES 播放mp3音乐,能暂停(附源码下载)

    项目地址 https://github.com/979451341/FFmpegOpenslES 这次说的是FFmpeg解码mp3,数据给OpenSL ES播放,并且能够暂停. 1.创建引擎 slCr ...

  4. 第十四届男篮世锦赛电视直播表

    男篮世锦赛电视直播表         8月30日 星期五 中央台-5 6:25 世界男篮锦标赛小组赛(中国-德国) 8月31日 星期六 中央台-5 8:55 世界男篮锦标赛小组赛(中国-阿尔及利亚) ...

  5. tcp/ip primer plus 第十四章 名字解析dns

    14.1名字解析的重要 在网络的发展初期,用户只能用长的麻烦的数字地址来标识和指定机器,(难道是  mac地址)然而网络点额互联带来了一个层次式的IP编址策略,即使用油类地址(网络层)和可以将地址转换 ...

  6. 计算机一级第十四套完整解析,2012年计算机一级MsOffice第十四套练习题及答案解析...

    1). 机器人从计算机应用领域分类看,它属于( ). A) 过程控制 B) 数据处理 C) 人工智能 D) 计算机辅助设计 2). 下列软件中,属于应用软件的是( ). A) Windows 2000 ...

  7. Android音视频学习系列(十) — 基于FFmpeg + OpenSL ES实现音频万能播放器

    系列文章 Android音视频学习系列(一) - JNI从入门到精通 Android音视频学习系列(二) - 交叉编译动态库.静态库的入门 Android音视频学习系列(三) - Shell脚本入门 ...

  8. FFMPEG之H264获取NALU并且解析其RBSP类型03

    FFMPEG之H264获取NALU并且解析其RBSP类型03 前言 FFMPEG之H264理论篇. 理论的就不多讲了,可以参考上面那篇文章,下面将给出两种版本,一种是我自己的,用C++方法实现,另一种 ...

  9. 收藏:视频网站(JavaEE+FFmpeg)/Nginx+ffmpeg实现流媒体直播点播系统

    FFmpeg安装(windows环境)http://www.cnblogs.com/xiezhidong/p/6924775.html 最简单的视频网站(JavaEE+FFmpeg)http://bl ...

  10. LiveVideoStack线上分享第三季(十四):FLV封装格式介绍及解析

    随着流媒体的高速发展,FLV成为了最主流的视频流传输封装格式,但是作为占市场较大份额的Web端的实际应用中,各大浏览器却没有对FLV解码做完善的支持.8月17日 20:00,LiveVideoStac ...

最新文章

  1. DL框架之MXNet :神经网络算法简介之MXNet 常见使用方法总结(神经网络DNN、CNN、RNN算法)之详细攻略(个人使用)
  2. oracle mysql 创建表,Oracle 创建表用户、空间
  3. Elasticsearch学习系列-搜索技术基本知识
  4. java 多态性 变量_java – 与实例变量的多态性
  5. mysql事件不定时执行_Mysql 中的事件//定时任务
  6. 在ASP.NET中如何运行后台任务
  7. go mysql delete_go 操作mysql、增删改查
  8. mysql db for python_Python使用MySQLdb for Python操作数据库教程
  9. ps制作哈7海报字体
  10. 【前端】HTML标签(上)
  11. 非常简单Java web下Office转PDF功能实现 100%能用
  12. java渗透_java 渗透模型
  13. TriangleCount三角形计数
  14. MySQL常见错误:Starting MySQL...The server quit without updating PID file (/usr/local/mysql/data/localhos
  15. kali linux 虚拟机iso 下载,Kali Linux 2016.2发布提供虚拟机以及系统镜像下载
  16. tabindex标签的用法
  17. 求和n!与1/n!,n从1取到20
  18. 罗永浩“网战”王自如:到底谁赢了?
  19. RabbitMq中的mandatory
  20. 【荐读】职场生存法则和智慧

热门文章

  1. Python:解决cmd中已经通过pip安装完某个包后在pycharm中却无法使用或安装
  2. pos mac java_有没有谁搞过银联POS终端mac算法[php版本]?
  3. SLAM_视觉SLAM中的一种单目稠密建图方法
  4. python_numpy_求L1损失的两种方法
  5. LR(1)项目集族的构造:如何确定前向搜索符
  6. 人工智能知识体系的学习路线(南京大学人工智能学院本科生培养体系)
  7. 【2019-08-18】时间是有密度的
  8. moss 搜索 属性过滤 值被移除了
  9. §4.1.2数学归纳法证明不等式第6题 (复旦大学2004年保送生考试数学试题)
  10. python 第一课作用