FFmpeg开发笔记(二十七)APP无法访问ZLMediaKit的HLS直播地址

上一篇文章介绍了如何通过ZLMediaKit实现视频推拉流,并使用VLC播放器验证视频直播地址。即使不用VLC播放器,直接在Qt工程的C++代码中调用FFmpeg的API,也能访问ZLMediaKit的直播地址,并正常渲染视频画面。关于如何在Qt工程中引入FFmpeg,可参考《FFmpeg开发实战:从零基础到短视频上线》一书的"第11章 FFmpeg的桌面开发"。

《FFmpeg开发实战:从零基础到短视频上线》一书的"第12章 FFmpeg的移动开发"介绍了如何在手机APP上集成FFmpeg。根据该书的操作步骤,在APP工程的JNI代码中调用FFmpeg的API,也能正常播放ZLMediaKit的直播画面。

但是如果手机APP不走FFmpeg,通过其他途径访问直播地址之时,却发现无法播放ZLMediaKit的HLS直播地址http://124.***.***.***:8080/live/test/hls.m3u8。无论采用谷歌官方的ExoPlayer,还是采用微信小程序的video标签,都播放不了ZLMediaKit的HLS视频。查看APP的报错日志,发现ExoPlayer扔出以下的错误信息:

复制代码
E/ExoPlayerImplInternal: Playback error
      com.google.android.exoplayer2.ExoPlaybackException: Source error
        at com.google.android.exoplayer2.ExoPlayerImplInternal.handleIoException(ExoPlayerImplInternal.java:641)
        at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:613)
        at android.os.Handler.dispatchMessage(Handler.java:105)
        at android.os.Looper.loopOnce(Looper.java:206)
        at android.os.Looper.loop(Looper.java:296)
        at android.os.HandlerThread.run(HandlerThread.java:67)
     Caused by: com.google.android.exoplayer2.upstream.HttpDataSource$InvalidResponseCodeException: Response code: 401
        at com.google.android.exoplayer2.upstream.DefaultHttpDataSource.open(DefaultHttpDataSource.java:396)
        at com.google.android.exoplayer2.upstream.DefaultDataSource.open(DefaultDataSource.java:258)
        at com.google.android.exoplayer2.upstream.StatsDataSource.open(StatsDataSource.java:84)
        at com.google.android.exoplayer2.source.hls.HlsMediaChunk.prepareExtraction(HlsMediaChunk.java:495)
        at com.google.android.exoplayer2.source.hls.HlsMediaChunk.feedDataToExtractor(HlsMediaChunk.java:468)
        at com.google.android.exoplayer2.source.hls.HlsMediaChunk.loadMedia(HlsMediaChunk.java:437)
        at com.google.android.exoplayer2.source.hls.HlsMediaChunk.load(HlsMediaChunk.java:394)
        at com.google.android.exoplayer2.upstream.Loader$LoadTask.run(Loader.java:412)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:930)

原来是流媒体服务端丢出了401错误,意思是没有权限拒绝访问。这个问题着实难搞,寻寻觅觅、反反复复,总也找不到为啥会没有权限,分明使用VLC播放器是可以正常播放的呀。

于是检查ZLMediaKit的源代码,发现ZLMediaKit内部对于HTTP地址增加了Cookie校验,原来这套校验规则适配了FFmpeg,却尚未适配ExoPlayer,也未适配小程序。那么修改ZLMediaKit源代码的src/Http/HttpFileManager.cpp,把accessFile函数中的401鉴权代码注释掉,并将修改后的代码文件上传到Linux服务器。

然后回到build目录运行make和make install命令重新编译安装ZLMediaKit,也就是依次执行下面命令。

复制代码
kill -s 9 `ps -aux | grep MediaServer | awk '{print $2}'`
cd /usr/local/src/ZLMediaKit/build
make
make install

编译安装完毕,执行下面命令,重新启动MediaServer服务。

复制代码
cd /usr/local/src/ZLMediaKit/release/linux/Debug
./MediaServer -d &

执行以下命令,将本地视频推流给ZLMediaKit。

复制代码
ffmpeg -re -stream_loop -1 -i "/usr/local/src/test/2018s.mp4" -vcodec h264 -f rtsp rtsp://127.0.0.1/live/test

然后在APP代码中使用ExoPlayer播放HLS地址http://124.***.***.***:8080/live/test/hls.m3u8,发现可以正常播放HLS视频了。接着使用真机调试微信小程序,发现通过video标签也能正常播放HLS视频了。更多详细的FFmpeg开发知识参见《FFmpeg开发实战:从零基础到短视频上线》一书。

相关推荐
Likeadust12 小时前
视频直播点播平台EasyDSS助力阳光政务直播体系建设
音视频·政务
skyjilygao13 小时前
n8n整合ffmpeg
ffmpeg·视频编辑·n8n
前端小黑屋15 小时前
小程序直播挂件Pendant问题
前端·微信小程序·直播
xcLeigh17 小时前
HTML5实现好看的视频播放器(三种风格,附源码)
前端·音视频·html5
别动哪条鱼17 小时前
SDL 函数对各对象缓冲区的影响
网络·数据结构·ffmpeg
骄傲的心别枯萎20 小时前
RV1126 NO.57:ROCKX+RV1126人脸识别推流项目之读取人脸图片并把特征值保存到sqlite3数据库
数据库·opencv·计算机视觉·sqlite·音视频·rv1126
好游科技20 小时前
IM即时通讯系统:安全可控、功能全面的社交解决方案全解析
安全·音视频·webrtc·im即时通讯·私有化部署im即时通讯·社交app
EasyDSS21 小时前
视频直播点播平台EasyDSS构建高并发、低延迟的远程教学直播新模式
音视频
GIOTTO情21 小时前
多模态舆情监测技术深度解析:Infoseek 如何实现 AI 造假与短视频舆情的精准捕捉?
人工智能·音视频
音视频牛哥21 小时前
C# 开发工业级 RTSP/RTMP 播放器实战:基于 SmartMediakit 的低延迟与高可靠性设计
音视频·rtsp播放器·rtmp播放器·windows rtsp播放器·windows rtmp播放器·c# rtsp播放器·c# rtmp播放器