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

相关推荐
Echo_NGC223722 分钟前
【FFmpeg 使用指南】Part 3:码率控制策略与质量评估体系
人工智能·ffmpeg·视频·码率
晚霞的不甘2 小时前
CANN 编译器深度解析:UB、L1 与 Global Memory 的协同调度机制
java·后端·spring·架构·音视频
美狐美颜SDK开放平台3 小时前
多终端适配下的人脸美型方案:美颜SDK工程开发实践分享
人工智能·音视频·美颜sdk·直播美颜sdk·视频美颜sdk
饭饭大王6666 小时前
CANN 生态深度整合:使用 `pipeline-runner` 构建高吞吐视频分析流水线
人工智能·音视频
xmRao7 小时前
Qt+FFmpeg 实现 PCM 音频转 AAC 编码
qt·ffmpeg·pcm
xmRao7 小时前
Qt+FFmpeg 实现录音程序(pcm转wav)
qt·ffmpeg
晚霞的不甘7 小时前
CANN 编译器深度解析:TBE 自定义算子开发实战
人工智能·架构·开源·音视频
愚公搬代码7 小时前
【愚公系列】《AI短视频创作一本通》016-AI短视频的生成(AI短视频运镜方法)
人工智能·音视频
那个村的李富贵8 小时前
CANN赋能AIGC“数字人”革命:实时视频换脸与表情驱动实战
aigc·音视频
晚霞的不甘9 小时前
CANN 支持强化学习:从 Isaac Gym 仿真到机械臂真机控制
人工智能·神经网络·架构·开源·音视频