ffmpeg本地TS和M3U8播放流程及调试过程

news/2024/7/10 20:56:34 标签: ffmpeg

 本地TS播放过程

本地M3U8播放过程

 http工作流程

 

 http分两个步骤

1、获取m3u8文件,这个是在哪里开始读的?

2、获取data数据,这个是从http_read开始读,可以通过修改这里实现buffer数据和引擎对接

3、s->user_agent,s->off,s->end_off,s->seekable这些是什么时候赋值的?

从 http_get_line获取到

4、需要修改的几个地方

1)http_get_line->ffurl_read

获取header

这个就模拟,主要是拿到长度

2)http_buf_read->ffurl_read

获取真正数据

调试过程

1、demo测试

通过URL传m3u8索引文件夹,真正TS数据通过读取本地文件来获取

修改:

http_buf_read

 即可

2、m3u8通过buffer方式获取

先拿到m3u8数据

hls以及能解析得到playlist,但是获取第一个block数据后还会去获取m3u8的数据,也就是之前的m3u8的connect还没断开

通过log看到header少了Connection: close,以及一个回车,通过添加Connection: close解决了m3u8会多次连接的问题,但会出现

 导致这个原因是因为读完第一个block后,没继续读下个block?

去掉之前私有协议的seek逻辑,在ijk_mediasource_readAt函数里去掉if (pointer_pos != position )

这么修改后,能播放了,看到希望咯

3、播放10左右,就把索引表的所有TS读完了,啥情况?

是因为ffurl_read有阻塞?而ijk_mediasource_readAt没有阻塞?

下面分析ffurl_read

int ffurl_read(URLContext *h, unsigned char *buf, int size)
{
    if (!(h->flags & AVIO_FLAG_READ))
        return AVERROR(EIO);
    return retry_transfer_wrapper(h, buf, size, 1, h->prot->url_read);
}

 ffurl_read() -> retry_transfer_wrapper()

static inline int retry_transfer_wrapper(URLContext *h, uint8_t *buf,
                                         int size, int size_min,
                                         int (*transfer_func)(URLContext *h,
                                                              uint8_t *buf,
                                                              int size))
{
    int ret, len;
    int fast_retries = 5;
    int64_t wait_since = 0;

    len = 0;
    while (len < size_min) {//如果len小于size_min,则循环,这里size_min=1
        if (ff_check_interrupt(&h->interrupt_callback))//检查是否结束
            return AVERROR_EXIT;
        ret = transfer_func(h, buf + len, size - len);//拉取数据
        if (ret == AVERROR(EINTR))//出错,继续
            continue;
        if (h->flags & AVIO_FLAG_NONBLOCK)
            return ret;
        if (ret == AVERROR(EAGAIN)) {//从新再来
            ret = 0;
            if (fast_retries) {//初始值5,尝试5次,5次后
                fast_retries--;
            } else {//睡眠方式尝试
                if (h->rw_timeout) {
                    if (!wait_since)
                        wait_since = av_gettime_relative();
                    else if (av_gettime_relative() > wait_since + h->rw_timeout)
                        return AVERROR(EIO);
                }
                av_usleep(1000);//开始睡眠1000us
            }
        } else if (ret < 1)
            return (ret < 0 && ret != AVERROR_EOF) ? ret : len;
        if (ret) {
            fast_retries = FFMAX(fast_retries, 2);
            wait_since = 0;
        }
        len += ret;
    }
    return len;
}


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

相关文章

计算机设计大赛 垃圾邮件(短信)分类算法实现 机器学习 深度学习

文章目录 0 前言2 垃圾短信/邮件 分类算法 原理2.1 常用的分类器 - 贝叶斯分类器 3 数据集介绍4 数据预处理5 特征提取6 训练分类器7 综合测试结果8 其他模型方法9 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 垃圾邮件(短信)分类算…

苹果macOS 恶意软件家族被曝光:通过破解软件分发,可窃取敏感信息

卡巴斯基安全实验室近日发布博文&#xff0c;发现了一种针对苹果 macOS 设备的新型恶意软件家族&#xff0c;并提醒苹果 Mac 用户谨慎下载破解软件。 报告称这种新型恶意软件家族高度复杂&#xff0c;主要伪装成为各种知名 macOS 软件的破解版分发&#xff0c;用户下载恶意 PKG…

【word visio绘图】关闭visio两线交叉的跳线(跨线)

【visio绘图】关闭visio两线交叉的跳线&#xff08;跨线&#xff09; 1 如何在Visio绘图中关闭visio两线交叉的跳线&#xff08;跨线&#xff09;第一步&#xff1a;打开Visio并创建您的图形第二步&#xff1a;绘制您的连接线第三步&#xff1a;关闭跳线第四步&#xff1a;手动…

2. HarmonyOS应用开发DevEcoStudio准备-1

2. HarmonyOS应用开发DevEcoStudio准备-1 下载 DevEco Studio 进入HUAWEI DevEco Studio产品页产品页。 单击下载列表右侧的按钮&#xff0c;下载 DevEco Studio。 安装 DevEco Studio 下载完成后&#xff0c;双击下载的 deveco-studio-xxxx.exe&#xff0c;进入 DevEco St…

LeetCode 热题 100 | 矩阵

目录 1 73. 矩阵置零 2 54. 螺旋矩阵 3 48. 旋转图像 4 240. 搜索二维矩阵 II 菜鸟做题第二周&#xff0c;语言是 C 1 73. 矩阵置零 解题思路&#xff1a; 遍历矩阵&#xff0c;寻找等于 0 的元素&#xff0c;记录对应的行和列将被记录的行的元素全部置 0将被记录的…

【ArcGIS模型构建器】07:批量将多个xy坐标(Excel、txt、csv)转为点shp图层

不需要写Python批处理代码,本讲利用模型构建器,批量将xy坐标(Excel、txt、csv)转为点shp图层。 文章目录 一、问题分析二、解决办法三、模型构建1. 新建模型2. 添加文件夹3. 添加表迭代器4. 创建XY事件图层5. 复制要素6. 运行模型四、注意事项一、问题分析 现有多个excel、t…

嵌入式学习第七天

C语言流程控制&#xff08;4&#xff09; 1.冒泡法排序&#xff1b; #include <stdio.h>int main(void) {int a[5] {32, 14, 73, 61, 43};int len sizeof(a) / sizeof(a[0]);int i 0;int j 0;int tmp 0;for (j 0; j < len-1; j){for (i 0; i < len-1-j; i…

研发日记,Matlab/Simulink避坑指南(六)——字节分割Bug

文章目录 前言 背景介绍 问题描述 分析排查 解决方案 总结归纳 前言 见《研发日记&#xff0c;Matlab/Simulink避坑指南&#xff08;一&#xff09;——Data Store Memory模块执行时序Bug》 见《研发日记&#xff0c;Matlab/Simulink避坑指南(二)——非对称数据溢出Bug》…