使用 ffmpeg 将 Mp4 转为 HLS

Mp4 to HLS using ffmpeg

我正在尝试在 iOS 应用中使用 ffmpeg 将本地 .mp4 视频转换为 HLS。我已经使用 pods 集成了 ffmpeg 包装器并生成了所有分段的 .ts 文件和 m3u8 文件,但是一些 .ts 文件段没有列在 .m3u8 播放列表文件中,如下所示。它总是列出最后 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);
    }];

还有其他方法吗?

转换为 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

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

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