• 背景
  • 分析思路
  • 解决思路

背景

FFmpeg是非常优秀的开源框架,在使用其进行二次开发及适配的过程中,难免会遇到各种各样的问题。
这次记录的是基于FFmpeg开发的播放器中,直播黑屏问题分析思路及解决方法。本文不涉及详细的代码流程,主要是提供分析思路。
问题如下:
在直播节目的使用过程中,某些播放源起播后画面黑屏,但却有声音,直播节目基于HLS。

分析思路

对于这类问题的分析,需要获取网络包和对应的日志,才能更好地定位问题原因。
分析步骤如下:
1、确认流的格式,确保流本身正常,视频编码方式可以支持。
可以在代码中dump流,或者直接从网络包中过滤去响应的媒体流,我更倾向于第二种。
流可以用PC端的VLC播放,可以明确流本身并无问题。同时查看编解码信息,确认这种视频格式我们是支持的(工具->编解码器信息,截图只是示例,不是出问题的流)

2、查看FFmpeg是否解析出正确的音视频格式。
我们可以在av_find_stream_info函数之后,使用av_dump_format函数将音视频信息dump出来,来确认FFmpeg是否解析正确。
可以看到,音频(PID[0xb3]),其相应信息已经解析出来Audio: mp2, 48000 Hz, stereo, s16, 192 kb/s
而另一个数据(PID[0xb2]),则具体信息并不清楚。

03-28 09:17:55.073 I/ffmpeg( 3431):   Duration:
03-28 09:17:55.073 I/ffmpeg( 3431): N/A
03-28 09:17:55.073 I/ffmpeg( 3431): , start:
03-28 09:17:55.073 I/ffmpeg( 3431): 75309.284411
03-28 09:17:55.073 I/ffmpeg( 3431): , bitrate:
03-28 09:17:55.073 I/ffmpeg( 3431): N/A
03-28 09:17:55.073 I/ffmpeg( 3431):
03-28 09:17:55.073 I/ffmpeg( 3431):   Program 5
03-28 09:17:55.073 I/ffmpeg( 3431):     Metadata:
03-28 09:17:55.073 I/ffmpeg( 3431):       service_name    : CCTV2 HD
03-28 09:17:55.073 I/ffmpeg( 3431):   No Program
03-28 09:17:55.083 I/ffmpeg( 3431):     Stream #0.0
03-28 09:17:55.083 I/ffmpeg( 3431): [0xb2]
03-28 09:17:55.083 I/ffmpeg( 3431): : Data: [0][0][0][0] / 0x0000
03-28 09:17:55.083 I/ffmpeg( 3431):
03-28 09:17:55.083 I/ffmpeg( 3431):     Stream #0.1
03-28 09:17:55.083 I/ffmpeg( 3431): [0xb3]
03-28 09:17:55.083 I/ffmpeg( 3431): : Audio: mp2, 48000 Hz, stereo, s16, 192 kb/s
03-28 09:17:55.083 I/ffmpeg( 3431):

3、使用TS解析工具解析并对比正常播放的流,可以看到正常播放时dump信息中,video信息已经解析出来,TS解析工具中,PID[0xb2]也即是视频PID。所以基本可以确定是FFmpeg没有正确解析PMT表。

03-28 09:18:51.983 I/ffmpeg( 3431): N/A
03-28 09:18:51.983 I/ffmpeg( 3431): , start:
03-28 09:18:51.983 I/ffmpeg( 3431): 75369.524411
03-28 09:18:51.983 I/ffmpeg( 3431): , bitrate:
03-28 09:18:51.983 I/ffmpeg( 3431): N/A
03-28 09:18:51.983 I/ffmpeg( 3431):
03-28 09:18:51.983 I/ffmpeg( 3431):   Program 5
03-28 09:18:51.983 I/ffmpeg( 3431):     Stream #0.0
03-28 09:18:51.983 I/ffmpeg( 3431): [0xb2]
03-28 09:18:51.983 I/ffmpeg( 3431): : Video: h264 (High), 1920x1088
03-28 09:18:51.983 I/ffmpeg( 3431): , 90k tbr
03-28 09:18:51.983 I/ffmpeg( 3431): , 90k tbn
03-28 09:18:51.983 I/ffmpeg( 3431):
03-28 09:18:51.983 I/ffmpeg( 3431):     Stream #0.1
03-28 09:18:51.983 I/ffmpeg( 3431): [0xb3]
03-28 09:18:51.983 I/ffmpeg( 3431): (eng)
03-28 09:18:51.983 I/ffmpeg( 3431): : Audio: mp2, 48000 Hz, stereo, s16, 192 kb/s

4、结合代码分析。
对于TS流PAT/PMT表的解析,也即是demux的流程了,该流程在avformat_open_input中。
查看mpegts对应的demux模块。对于avformat_open_input流程,一般是调用read_head函数,即mpegts_read_header。

AVInputFormat ff_mpegts_demuxer = {"mpegts",NULL_IF_CONFIG_SMALL("MPEG-2 transport stream format"),sizeof(MpegTSContext),mpegts_probe,mpegts_read_header,mpegts_read_packet,mpegts_read_close,.read_seek = mpegts_read_seek,.read_timestamp = mpegts_get_dts,.flags = AVFMT_SHOW_IDS|AVFMT_TS_DISCONT| AVFMT_GENERIC_INDEX,
};

可以看到,为了加快起播速度,probe_size 设置的较小(256kB),handle_packets函数会根据设置的probe_size,读取一定数量的ts包进行解析,这就造成一种情况,可能读取不到PAT表。

static int mpegts_read_header(AVFormatContext *s,AVFormatParameters *ap)
{....省略//find PMT, would stop parseprobe_size =256 * 1024;//fast playhandle_packets(ts, probe_size / ts->raw_packet_size);....省略}

5、使用EasyICE分析TS切片。
256kB对应的偏移量为0x40000,拿m3u8中第一个下载的分片(注意是第一个下载的分片,不是列表中的第一个,因为不一定从头开始下载)。
使用EasyICE分析,可以看到,PAT表偏移为0x6C3A8,大于0x40000,所以demux阶段,并没有获取到PAT/PMT表,所以无法解析出正确的视频格式。
而音频为什么能解析出来呢,这是因为av_find_stream_info还有弹窗流程,可以解析出音频格式,但视频在这种情况下无法完整解析出来。

总结:该问题在于FFmpeg没有读取到PAT/PMT,导致解析错误。原因可能是直播流比较大,这种情况下,媒体数据较大,PSI/SI信息在TS流中占比可能较小,读取太小的数据就可能出错。

解决思路

解析该问题的方法有两种:
1、从客户端解决,即加大demux阶段解析的数据大小,但其实无法保证在流更大或者PSI/SI分布太稀疏的情况下也正常,且网络较差的情况下,起播速度会有一定影响。
2、从CDN解决,媒体服务器在对于HLS协议的直播流,可以在每个分片的最开始插入PSI/SI信息,这样可以保证客户端一定能正确获取。

FFmpeg 直播黑屏问题分析解决相关推荐

  1. RTMP直播黑屏问题分析与解决

    问题发现 一客户直播环境为ffmpeg进行rtsp拉流,然后转换为rtmp推流.最近ffmpeg版本进行更新后发现后端进行rtmp播放时会出现黑屏现象,但是有数据流.如果使用老版本的ffmpeg则没有 ...

  2. ffmpeg断流黑屏问题分析

    转载请标明出处,尊重原作者,https://blog.csdn.net/qq_36491519/article/details/86535967 做安防+AI的很多人都遇到过黑屏问题,这各问题在个平台 ...

  3. cf两边黑屏怎么解决win10_Win10/7系统进入LOL英雄联盟显示输入不支持并黑屏原因及解决方法...

    近期,公众号一个铁粉"百无聊赖"遇到一个问题,那就是在玩LOL英雄联盟进入游戏的时候出现了会黑屏,弹出了"输入不支持"的字样,并表示自己的将所有的驱动都升级了一 ...

  4. Ubuntu 16.04+GTX970 黑屏无法安装解决方法

    Ubuntu 16.04+GTX970 黑屏无法安装解决方法 参考http://www.linuxidc.com/Linux/2017-01/139318.htm http://blog.scienc ...

  5. cf两边黑屏怎么解决win10_win10开机无限黑屏转圈重启解决方法

    今天同事小梦的电脑又双叒叕出问题了.她来到公司后,打开电脑,发现进不去系统,一直是开机黑屏转圈重启,看到小编到公司后立马拉着我去当"维修工"了.一般人们遇到这个问题都是送去维修,但 ...

  6. 计算机出现黑屏问题方法派出,电脑重装系统开机常见黑屏问题的解决方法

    电脑出现黑屏问题怎么办?电脑在开机的时候黑屏了,无法进入系统怎么办?最近有不少小伙伴反映,电脑开机出现黑屏问题,这是怎么回事?要怎么解决?相信小伙伴们都很心急.不过别担心,虽然说出现黑屏的原因有很多, ...

  7. win11退回win10一直黑屏转圈怎么办 win11退回win10黑屏转圈的解决方法

    在将win11退回win10系统的过程中,一些网民遇到了问题.win11退回win10一直在黑屏转圈是很常见的,那么如何解决这个问题呢?下面就教下大家win11退回win10一直黑屏转圈的解决方法.更 ...

  8. android 接电话 返回后黑屏,安卓手机打电话黑屏怎么办?解决安卓接电话黑屏

    现在的手机市场几乎被iphone和安卓手机占领着,相信你或者你的周围绝大部分朋友都有安卓手机,到那时是手机多少都会出点问题,小编自己就遇到过,使用安卓手机打电话时竟然黑屏.如果说偶尔遇到一两次,那也就 ...

  9. 完美世界手游服务器维护中,完美世界手游黑屏闪退解决办法 玩不了怎么办

    完美世界手游玩不了怎么办?黑屏闪退怎么解决?游戏中很多玩家玩的时候出现了黑屏闪退的情况,下面由第一手游网小编为大家带来黑屏闪退解决办法吧! 完美世界手游黑屏闪退解决办法 1.内存不足 造成游戏黑屏,很 ...

最新文章

  1. css如何让图片不平铺,css怎么设置图片平铺方式?
  2. 004_Vue按键修饰符
  3. Java线程中wait、await、sleep、yield、join用法总结
  4. 谁是颠覆者?最全盘点25条区块链主链
  5. Mac下django简单安装配置步骤
  6. 梅宏院士:步入软件定义的时代
  7. mysql入门到跑路_Mysql入门二十小题(DBA老司机带你删库到跑路)2018.11.26
  8. 多变量逻辑回归python_Python实现逻辑回归(Logistic Regression in Python)
  9. u盘efi安装linux6.5,CentOS6.5安装的UEFI-GPT回退为MBR引导详解
  10. php整么去掉时间的年月日,php强大的时间转换函数strtotime
  11. 以下关于c语言中static和const,c语言中static const作用
  12. 写入sql时间_一问SQL优化就无从藏身?那只是你对原理的精髓掌握不深
  13. html 强制用ie浏览,强制指定IE浏览器版本
  14. 【无标题】Vue长列表性能优化常用方案
  15. macos可以升级到指定版本吗_[macOS]如何升级更新 Mac 系统
  16. 蓝凌工作ekp开发使用一些js编写开发记录
  17. angular async和await (实用)
  18. 外部连接Redis时候,出现Time Out异常
  19. 分布式文件系统:HDFS 核心原理
  20. 本题要求实现一个计算xn(n≥0)的函数。

热门文章

  1. win10 powershell无法激活conda v4.9环境
  2. pyecharts画饼形图,圆形图,环形图(含百分比显示)【python干货】
  3. 仿win10系统UI界面纯html网页网站后台UI界面
  4. 王者荣耀购买装备----笔记
  5. 计算机教室突发事件处理,课堂突发事件处理
  6. 经典《飞机大战》游戏,难道你不想自己动手开发一个嘛(附源码免费下载)
  7. 零基础入门编程神器!苹果的免费编程应用出了Mac版了
  8. 2022年中级会计中级经济学法考试复习题及答案
  9. 华为交换机升级包及补丁验证完整性
  10. c语言机票座位预定系统_c语言编写~~~机票座位预订系统