tl; dr-将独立的短视频连接到hls播放列表会产生声音缺陷。在连接点发出“滴答”声。如何避免呢?
我有一个过程,每3秒发出4秒钟的MOV视频。 那些4s视频是较长视频的一部分。但是它们是完全独立的。 我希望能够播放更长的视频,然后再播放。 为了实现这一点,我正在创建一个HLS甚至播放列表 hls event playlist 我首先使用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文件(part2.ts) 并播放。
唯一的问题是声音缺陷。恰好在两个视频的连接点上(在第二个4处)。 该视频没有可见的缺陷。 我怀疑这是由于编码问题引起的。 (每个mov视频都分别编码为hls) 但是我必须在4秒钟后播放视频。 (等不及要准备好整个过程)
我做错了什么?如何对hls块进行编码以避免声音缺陷?
在ffmpeg文档中,我看到了: 分割输入文件,并创建一个M3U8实时播放列表(可以用作实时HLS源):
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
我的问题是我没有完整的视频。它逐块生成。
答案 0 :(得分:0)
问题在于AAC并不是仅将单独编码的片段连接在一起的友好格式。 AAC始终是1024个样本的倍数。如果您的音频块恰好是1025个样本,则将生成的编码填充到2048,最后得到1023个静默样本。通常你不知道有多少沉默。因此,您必须使所有块的ffmpeg编码过程都保持活动状态。如果您使用的是Unix,请创建一个名称管道,然后将视频输入管道到命名管道中,并ffmpeg读取名称管道。
mkfifo my_pipe
cat my_file > my_pipe
ffmpeg -re -i my_pipe // and some more