使用 ffmpeg 将 Mp4 转换为 HLS

Posted

技术标签:

【中文标题】使用 ffmpeg 将 Mp4 转换为 HLS【英文标题】:Mp4 to HLS using ffmpeg 【发布时间】:2015-09-03 22:12:52 【问题描述】:

我正在尝试在 ios 应用中使用 ffmpeg 将本地 .mp4 视频转换为 HLS。我已经使用 pods 集成了 ffmpeg 包装器并生成了所有分段的 .ts 文件和 m3u8 文件,但是 .m3u8 播放列表文件中没有列出一些 .ts 文件段,如下所示。它总是列出最后 5 个视频片段。

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:2
#EXT-X-MEDIA-SEQUENCE:13
#EXTINF:2,
out13.ts
#EXTINF:1,
out14.ts
#EXTINF:2,
out15.ts
#EXTINF:2,
out16.ts
#EXTINF:1,
out17.ts
#EXT-X-ENDLIST

我使用以下代码生成 HLS。

    FFmpegWrapper *wrapper = [[FFmpegWrapper alloc] init];
    [wrapper convertInputPath:inputFilePath outputPath:outputFilePath options:nil progressBlock:^(NSUInteger bytesRead, uint64_t totalBytesRead, uint64_t totalBytesExpectedToRead) 

     completionBlock:^(BOOL success, NSError *error) 
        success?NSLog(@"Success...."):NSLog(@"Error : %@",error.localizedDescription);
    ];

有没有其他方法可以做到这一点?

【问题讨论】:

我正在考虑让用户的设备对他们拍摄的视频进行编码,而不是在服务器上进行。我很好奇编码是否会在用户方面花费太长时间。你能评论一下你的经历吗? 关于@GaziAlankus 问题的任何信息?我也很好奇需要多长时间 我已经尝试了长达 15 分钟的视频,而且它一切正常,无需花费太多时间。 HLS 模块在几秒钟内完成。可能需要一些时间,具体取决于视频质量和视频长度。 【参考方案1】:

转换为 HLS 时的默认列表大小为 5。因此,您将获得最后 5 个 .ts 文件。您必须设置 -hls_list_size 0 以包含所有生成的 .ts 文件。

ffmpeg -i input.mp4 -profile:v baseline -level 3.0 -s 640x360 -start_number 0 -hls_time 10 -hls_list_size 0 -f hls index.m3u8更多here

【讨论】:

感谢您的回复,但我应该在我的代码中哪里设置这个大小。我在 iphone 应用程序中使用它。 我不知道你的 iPhone 应用。您可以从 Apple 寻找 Media File Segmenter。 link【参考方案2】:

最后我通过使用以下代码在FFOutputFile.m 中设置 hls 大小解决了这个问题。

av_opt_set_int(formatContext->priv_data, "hls_list_size", list_size, 0);

【讨论】:

你到底是在哪里添加的?我面临同样的问题。你能帮忙吗? @Bhumit:在 FFOutputFile.m 中,您可以看到一个 init 方法 - (id) initWithPath:(NSString *)path options:(NSDictionary *)options。在这个函数中设置代码。

以上是关于使用 ffmpeg 将 Mp4 转换为 HLS的主要内容,如果未能解决你的问题,请参考以下文章

使用ffmpeg把mp4与m3u8相互转换的操作

Linux下使用FFmpeg将RTMP流转换为HLS

text 将MP4转换为HLS

Google Cloud Platform:将上传的 MP4 文件转换为 HLS 文件

使用 FFMPEG 将 mp4 转换为最大支持移动设备的 MP4 [关闭]

使用 ffmpeg 将视频转换为 MP4 (H.264/AAC)