将独立的短视频连接到hls播放列表中会产生声音缺陷。连接点处的“滴答声”。我该怎么避免呢?
我有一个进程,每3秒发出一个4秒的MOV视频。这些4s视频是较长视频的片段。但他们完全独立。我希望能够在视频存在之前播放更长的视频。为了实现这一点,我创建了一个HLS甚至播放列表hls事件播放列表,我首先通过运行以下命令,使用ffmpeg将第一个4s视频转换为hls:
fmpeg -y -i output0.mov -c:a aac -b:a 128000 -r:a 44100 -c:v libx264 -x264-params keyint=150:scenecut=0 -hls_flags omit_endlist -hls_playlist_type -b:t 800k -maxrate 2000k -bufsize 1200k -f hls -pix_fmt yuv420p -g 5 -hls_time 5 one.m3u8这将创建一个.ts文件和一个.m3u8播放列表。
#EXT-X-PLAYLIST-TYPE:EVENT
#EXT-X-TARGETDURATION:4
#EXT-X-VERSION:4
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:4.00,
part1.ts注意:-hls_flags omit_endlist -hls_playlist_type event标志。它们确保播放列表是事件播放列表,并且列表末尾没有EXT-X-ENDLIST (这使得播放器开始轮询.m3u8文件,以便“等待”添加到播放列表中的新.ts块)。
当下一个4s视频可用时,我将再次运行ffmpeg命令。然后将新的.m3u8文件“合并”到旧的.m3u8文件。将新的.ts文件追加到播放列表中。
#EXT-X-PLAYLIST-TYPE:EVENT
#EXT-X-TARGETDURATION:4
#EXT-X-VERSION:4
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:4.00,
part1.ts <- first 4 seconds chunk
#EXTINF:4.00,
part2.ts <- second ( new ) 4 second chunk由于播放机正在轮询.m3u8文件,当其更新时,它将获取第二个.ts文件( plays 2.ts)并播放它。
唯一的问题是声音的缺陷。就在这两个视频的连接点。(在第二个4)在这个例子中。这个视频没有明显的缺陷。我怀疑这是因为编码问题。(每个移动视频都分别编码到hls ),但我必须在4秒后播放该视频。(等不及整个时间准备好了)
我做错什么了?如何对hls块进行编码以避免声音缺陷?
在ffmpeg文档中,我看到:分段输入文件,并创建一个M3U8活动播放列表(可以用作live源):
ffmpeg -re -i in.mkv -codec copy -map 0 -f segment -segment_list playlist.m3u8 \
-segment_list_flags +live -segment_time 10 out%03d.mkv我的问题是我没有全部的视频。它一片一片地生成。
发布于 2019-05-24 17:48:12
问题是,AAC不是一个友好的格式,只是将单独编码的部分连接在一起。AAC总是1024个样本的倍数。如果您的音频块恰好是1025样本,则生成的编码将被填充到2048,您将得到1023个沉默样本。通常你根本不知道那里有多少寂静。因此,您必须使ffmpeg编码过程对所有块保持活动。如果您在Unix上,创建一个名称管道,将您的视频输入到您的命名管道中,并让ffmpeg读取名称管道。
mkfifo my_pipe
cat my_file > my_pipe
ffmpeg -re -i my_pipe // and some morehttps://stackoverflow.com/questions/54633953
复制相似问题