当输入视频使用AVComposition连接多个剪辑时,ffmpeg HLS流音频不同步

当输入视频使用AVComposition连接多个剪辑时,ffmpeg HLS流音频不同步,ffmpeg,avfoundation,http-live-streaming,avassetexportsession,avcomposition,Ffmpeg,Avfoundation,Http Live Streaming,Avassetexportsession,Avcomposition,我在创建HLS流时遇到了问题,似乎是在FFMPEG或iOS AVFoundation端 我目前正在开发一个视频应用程序,允许用户录制、剪切和合并多个剪辑。这是使用AVMutableComposition和如下代码完成的: try videoTrack?.insertTimeRange(clip.range, of: videoAssetTrack, at: accumulatedTime) try audioTrack?.insertTimeRange(clip.range, of: audio

我在创建HLS流时遇到了问题,似乎是在FFMPEG或iOS AVFoundation端

我目前正在开发一个视频应用程序,允许用户录制、剪切和合并多个剪辑。这是使用
AVMutableComposition
和如下代码完成的:

try videoTrack?.insertTimeRange(clip.range, of: videoAssetTrack, at: accumulatedTime)
try audioTrack?.insertTimeRange(clip.range, of: audioAssetTrack, at: accumulatedTime)
然后使用

AVAssetExportSession(asset: composition, presetName: preferredPreset)
然后将其上载到服务器,该服务器使用以下代码从视频中创建HLS流:

ffmpeg -i bunny.mov -y -g 48 -sc_threshold 0 \
-map 0:0 -map 0:1 -s:v:0 1280x720 -c:v:0 h264 -b:v:0 4000k \
-map 0:0 -map 0:1 -s:v:1 854x480 -c:v:1 h264 -b:v:1 2000k \
-map 0:0 -map 0:1 -s:v:2 640x360 -c:v:2 h264 -b:v:2 1000k \
-map 0:0 -map 0:1 -s:v:3 480x270 -c:v:3 h264 -b:v:3 500k \
-c:a copy -var_stream_map "v:0,a:0 v:1,a:1 v:2,a:2 v:3,a:3" \
-master_pl_name bunny.m3u8 -f hls -hls_time 1 -hls_list_size 0 \
-hls_segment_filename ~/Downloads/bunny/bunny.%v.%03d.ts \
-hls_base_url http://tomaskohout.cz/bunny/ ~/Downloads/bunny/bunny.%v.m3u8
输入使用两个剪辑(第一个是鸟,第二个是兔子)剪切在一起的视频将产生以下m3u8文件(在safari中打开以观看播放):

问题在于,在第一次切割后,音频重叠且不同步(注意螺母撞击鸟的声音播放了两次),最后一秒只是一个静止帧

用于比较的原始视频如下所示:

这似乎是AVF基金会的一个普遍问题。如果使用QuickTime(使用编辑>将剪辑添加到结尾)连接两个剪辑,并将生成的视频用作ffmpeg的输入,则音频和视频也将不同步。它似乎生成了一些奇怪的视频,只有quicktime知道如何播放。如果您拍摄原始视频并尝试使用VLC播放,它也将不同步,甚至会显示部分原本不应在原始剪辑中的剪辑。这可能与我的工作有关,但我真的不在这里

我找到了一个解决方法,首先将视频转换为mp4(在我的例子中,它只是将mp4转换为mp4),如下所示:

try videoTrack?.insertTimeRange(clip.range, of: videoAssetTrack, at: accumulatedTime)
try audioTrack?.insertTimeRange(clip.range, of: audioAssetTrack, at: accumulatedTime)
ffmpeg-i input.mp4-c:v:0 h264 input.preexport.mp4

然后使用预导出版本生成m3u8文件。这似乎可以正确重定时视频

这当然不理想,因为我必须把视频看两遍

因此,我想问一下,是否有一个选项,允许我在生成hls的同时重新定时视频,或者如果有其他解决方案,则更好

谢谢大家!


托马斯

这里的问题是没有一种方法可以做到这一点。在给定的文件中,音频和视频的长度几乎不完全相同。所以,在加入时,您是应该对所有音频进行压缩,还是尝试查找重叠的音频并对其进行修剪?没有正确的答案,ffmpeg选择了一种方法,苹果选择了另一种。如果您喜欢其他方法,您可能需要自己编写代码。谢谢您的回复!我不知道我是否明白你在说什么。如果我在转换到HLS之前运行
ffmpeg-I input.mp4-c:v:0 h264 input.preexport.mp4
,一切都会正常工作。因此,有一种方法可以做到这一点。我只想为自己多留一次通过视频。。。