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开发实战:从零基础到短视频上线》一书。

相关推荐
CV实验室5 小时前
CVPR 2025 | 北大团队SLAM3R:单目RGB长视频实时重建,精度效率双杀!
人工智能·计算机视觉·论文·音视频
chenchao_shenzhen8 小时前
RK3568嵌入式音视频硬件编解码4K 60帧 rkmpp FFmpeg7.1 音视频开发
ffmpeg·音视频·rk3588·音视频开发·嵌入式开发·瑞芯微rk3568·硬件编解码
音视频牛哥8 小时前
H.264、H.265 到 H.266:编码标准演进、RTSP支持与实时视频系统实战
音视频·大牛直播sdk·h.266编码·rtmp h.266·rtsp h.266·h.266解码·h.265和h.266差异
从后端到QT16 小时前
RTCP详解
服务器·音视频·实时音视频·rctp
ECC&SM917 小时前
Video_AVI_Packet(2)
笔记·音视频
_多拉不懂A梦18 小时前
FFmepg源码系列-avformat_open_input()
c++·ffmpeg·音视频
iphone1081 天前
视频创作者如何保护自己的视频内容版权?
音视频·加密软件·视频加密·加密技术·视频安全·保护原创·知识原创
音视频牛哥1 天前
Android平台RTSP播放器选型指南:从开源方案到跨平台低延迟专业SDK
android·人工智能·音视频·大牛直播sdk·android rtsp播放器·安卓rtsp播放器·安卓播放rtsp流
火山引擎边缘云2 天前
基于 DiT 大模型与字体级分割的视频字幕无痕擦除方案,助力短剧出海
音视频
欣赏你流浪^2 天前
物联网智能感知进阶:基于YOLO的琏雾系统视频分析
物联网·yolo·音视频