FFMPEG中需要哪些参数才能将(HLS)流传输到现代Android设备?

问题描述 投票:0回答:1

我想将常规视频文件(MP4 x264)转换为HLS,以便使用ffmpeg在Android设备上进行流式传输。我有一个html5播放器设置来播放HLS流(m3u8),并且已经在Chrome和Firefox桌面浏览器上对其进行了测试,并且一切正常。问题是,相同的确切播放器和m3u8播放列表在Android Chrome和Android Firefox上不起作用(都给出了不受支持的文件类型错误)。

起初,我认为html5播放器和HLS支持可能是一个问题,因此我从Google的快速搜索中随机提取了一个m3u8播放列表流,当然,该流在Android上的html5播放器中运行良好。因此,我知道这不是html5播放器,并且缺少HLS支持。我认为我在ffmpeg中使用了不正确的编解码器或其他参数,但是经过数十次尝试后,我决定在这里询问,因为我全都没有想法。

我原来的ffmpeg命令是:

ffmpeg -i "test.mp4" -preset ultrafast -c:v h264 -c:a aac -f ssegment -segment_list playlist.m3u8 -segment_list_type hls -segment_list_size 0 out_%6d.ts

我尝试过:

ffmpeg -i "test.mp4" -c:v libx264 -c:a aac -ac 1 -strict -2 -crf 18 -profile:v baseline -maxrate 400k -bufsize 1835k -pix_fmt yuv420p -flags -global_header -hls_time 10 -hls_list_size 6 -hls_wrap 10 -start_number 1 playlist.m3u8
ffmpeg -i "test.mp4" -c:v copy -c:a aac -ac 2 -f hls -hls_time 60 -hls_playlist_type event playlist.m3u8
ffmpeg -i "test.mp4" -c:a aac -ar 48000 -c:v h264 -profile:v main -crf 20 -sc_threshold 0 -hls_playlist_type vod -vf scale=w=640:h=360:force_original_aspect_ratio=decrease -b:v 800k -maxrate 856k -bufsize 1200k -b:a 96k -hls_segment_filename 360p_%03d.ts playlist.m3u8 
ffmpeg -i "test.mp4" -c:v libx264 -c:a aac -ac 1 -strict -2 -crf 18 -profile:v baseline -maxrate 400k -bufsize 1835k -pix_fmt yuv420p -flags -global_header -hls_time 10 -hls_list_size 6 -hls_wrap 10 -start_number 1 playlist.m3u8

并且已经尝试了数十种其他模式组合,即更改段文件的大小,设置宽高比,以及几乎所有可以找到的示例。我知道我可能只是错误地输入了一个参数,或者这可能是标题问题?

正如我之前所说,我在线上获取了示例HLS流,但没有出现任何问题。只有当我通过ffmpeg运行它时,它才不能在移动设备上运行。我还下载了一个测试mp4文件,以防万一我的文件有问题,但这没什么区别。

我一直在追踪问题所在。我之所以能够解决编解码器问题,是因为我拿了一个样本视频文件,并将其重新编码为mp4(h264 aac)。在Android上的html5播放器中,只要它为mp4格式,它就可以正确流式传输。

我已经能够将其范围缩小到与m3u8播放列表文件本身和/或文件位置有关的内容。也许m3u8播放列表文件缺少参数。试图将其与互联网上发现的其他对象进行比较,到目前为止还没有真正注意到它们的区别。

android ffmpeg http-live-streaming
1个回答
1
投票

好吧,我终于找到了答案,所有事情都与我怀疑的最后一件事有关:htaccess。在尝试调试问题所在的过程中,我决定从Internet上找到一个示例HLS播放列表,并将其放在我的服务器上。我相应地包含了m3u8和ts文件并进行了测试。它可以在桌面浏览器(Chrome和Firefox)上运行,但再次不能在移动浏览器上运行(在Android版本的Chrome,Firefox和Opera上进行了测试)。有趣的是,当我从在线来源使用m3u8播放列表时,它可以在移动设备上使用,但是当托管在我的服务器上(相同的文件)时,它不起作用。

删除.htacess后。文件,它再次从我的服务器在移动设备上工作!对于我的一生,我不知道为什么这是问题所在。 .htaccess文件中所有的都是:

AuthType Basic
AuthName "Restrictions"    
AuthUserFile /path_to_passwd/.htpasswd  
<RequireAny>
     Require user UserthatisValid
</RequireAny>

在移动设备上,用户得到了正确的身份验证,因为他们在没有提供凭据的情况下无法访问html5播放器。我的猜测是我的Web服务器(Apache)中的某些内容配置错误或需要启用某些模块。但是,为什么台式机版本可以工作而移动版仍然没有意义。也许与标题有关。我也不认为这是CORS的问题,因为Chrome的Device Remote Logger会选择这种问题。或者,移动设备请求文件和访问页面的方式可能有所不同。无论哪种方式对我来说都没有意义,为什么台式机版本不能工作而移动版不能工作。

将进行更多测试以找出到底是什么引起了问题,但是直接的解决方法是允许直接访问m3u8播放列表文件,而无需在.htaccess中进行身份验证或将其完全删除。不适用于生产用途,但可以成功工作。

© www.soinside.com 2019 - 2024. All rights reserved.