ffmpeg 关键帧控制单个图像 + 音频
ffmpeg keyframe control on single image + audio
我已经搜索了我能找到的所有相关的 Whosebug 问题,其中 none 解决了问题,如果我错过了可以解决的问题,请提前致歉。
我正在处理的应用程序将视频或音频文件转换为 mp4,然后在服务器上转换为 hls 播放列表。我刚刚实现了音频,我想要一个背景图像。在阅读了 Whosebug 上的各种选项后,我确定了以下参数:
-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-https://domain/video.m3u8 中索引为 0 的片段的持续时间为 464.96,而报告的持续时间为 0.04,目标持续时间为 0.04。对于 HLS 内容,超过目标持续时间的持续时间可能会导致播放问题。有关详细信息,请参阅 EXT-X-TARGETDURATION 上的 HLS 规范部分:https://datatracker.ietf.org/doc/html/draft-pantos-http-live-streaming-23#section-4.3.3.1 https://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_loop116(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 copy -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 segment-%03d.ts result.m3u8
listOfFiles.txt在讨论的案例中始终只包含一个文件。
我怎样才能用最短的处理时间实现这一点,但仍然可以将文件转换为 HLS?
感谢@Gyan 在评论中解决了这个问题:
在图像输入之前添加-loop 1 -framerate 0.5,在libx264之后添加-intra
添加-shortest -fflags +shortest -max_interleave_delta 100M
我已经搜索了我能找到的所有相关的 Whosebug 问题,其中 none 解决了问题,如果我错过了可以解决的问题,请提前致歉。
我正在处理的应用程序将视频或音频文件转换为 mp4,然后在服务器上转换为 hls 播放列表。我刚刚实现了音频,我想要一个背景图像。在阅读了 Whosebug 上的各种选项后,我确定了以下参数:
-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-https://domain/video.m3u8 中索引为 0 的片段的持续时间为 464.96,而报告的持续时间为 0.04,目标持续时间为 0.04。对于 HLS 内容,超过目标持续时间的持续时间可能会导致播放问题。有关详细信息,请参阅 EXT-X-TARGETDURATION 上的 HLS 规范部分:https://datatracker.ietf.org/doc/html/draft-pantos-http-live-streaming-23#section-4.3.3.1 https://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_loop116(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 copy -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 segment-%03d.ts result.m3u8
listOfFiles.txt在讨论的案例中始终只包含一个文件。
我怎样才能用最短的处理时间实现这一点,但仍然可以将文件转换为 HLS?
感谢@Gyan 在评论中解决了这个问题:
在图像输入之前添加-loop 1 -framerate 0.5,在libx264之后添加-intra
添加-shortest -fflags +shortest -max_interleave_delta 100M