【发布时间】:2021-08-02 20:28:55
【问题描述】:
我已经搜索了我能找到的所有相关的 stackoverflow 问题,但没有一个能解决这个问题,如果我错过了一个可行的问题,请提前道歉。
我正在开发的应用程序将视频或音频文件转换为 mp4,然后在服务器上转换为 hls 播放列表。我刚刚实现了音频,我想要一个背景图像。在阅读了 stackoverflow 上的各种选项后,我选择了以下参数:
-y -i "C:\path\ExternalAudioBackground.png" -i "C:\path\Audio.mp3" -vf scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:-1: -1:color=black -c:a copy -vcodec libx264 -pix_fmt yuv420p "C:\path\external_media_file.mp4"
之所以选择这组 args,是因为它是即时的,因为 -c:a 副本以及确保所有视频具有相同纵横比和编码的约束。
问题是当将其转换为 hls 流时,流无法播放(在 video.js 播放器和 vlc 中)并显示以下消息:
VIDEOJS:警告:当报告的持续时间为 0.04 且目标持续时间为 0.04 时,播放列表 0-https://domain/video.m3u8 中索引为 0 的片段的持续时间为 464.96。对于 HLS 内容,超过目标持续时间的持续时间可能会导致播放问题。有关详细信息,请参阅 EXT-X-TARGETDURATION 上的 HLS 规范部分:https://datatracker.ietf.org/doc/html/draft-pantos-http-live-streaming-23#section-4.3.3.1https://datatracker.ietf.org/doc/html/draft-pantos-http-live-streaming-23#section-4.3.3.1
在开头添加 -loop 1 会将处理时间从毫秒增加到分钟,但会生成一个工作文件
添加 -r 1 和 -loop 1 比不添加 -r (!?) 需要更长的处理时间
在图像输入循环播放音频的前 4 秒之前,添加 -stream_loop 116(116 是以秒为单位的音频长度除以 4,所需的 hls 段大小)
添加 -g 96 (96 是 fps * 4)
如果相关,hls 编码参数如下所示:
-safe 0 -f concat -i listOfFiles.txt -c:a aac -ar 48000 -b:a 128k -vcodec 复制 -crf 20 -g 48 -keyint_min 48 -sc_threshold 0 -b:v 2500k -maxrate 2675k -bufsize 3750k -hls_time 4 -hls_playlist_type vod -hls_segment_filename 段-%03d.ts result.m3u8
listOfFiles.txt 在所讨论的案例中始终只包含一个文件。
我怎样才能以最短的处理时间实现这一目标,但仍然可以将文件转换为 HLS?
【问题讨论】:
-
图片输入前添加
-loop 1 -framerate 0.5,libx264后添加-intra -
在您的 HLS 命令中,
-crf 20 -g 48 -keyint_min 48 -sc_threshold 0 -b:v 2500k -maxrate 2675k -bufsize 3750k无效。删除它们。 -
@Gyan 运行了一个小时后,我终止了该进程。它在输出中达到了 787 分钟的时间。 mp3 为 7 分钟。
-
也添加
-shortest -fflags +shortest -max_interleave_delta 100M。 -
@Gyan 很棒,现在运行良好。如果您想将其发布在代表的答案中,我会将其标记为已接受。如果你不介意我可以自己回答。如果您有时间,我很想解释一下不同标志如何解决问题。我了解其中的一些,但了解如何使用 ffmpeg 比复制粘贴其他人的代码要好得多,正如您在第二条评论中使用 HLS 命令所展示的那样。我特别不明白的是 -intra -fflags -max_interleave...
标签: ffmpeg http-live-streaming