0

我在创建 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 中打开以查看它的播放):http ://tomaskohout.cz/bunny/bunny.m3u8

问题是第一次剪辑后音频重叠且不同步(注意坚果击中鸟的声音播放两次),最后一秒只是一个静止帧。

比较的原始视频在这里: http ://tomaskohout.cz/bunny/original.mov

一般来说,这似乎是 AVFoundation 中的一个问题。如果您使用 QuickTime 加入两个剪辑(使用“编辑”>“将剪辑添加到结尾”)并使用生成的视频作为 ffmpeg 的输入,它也会导致音频和视频不同步。似乎它会生成一些奇怪的定时视频,只有 quicktime 知道如何播放。如果您拍摄原始视频并尝试使用 VLC 播放它,它也会不同步,甚至会显示不应该出现在原始剪辑中的部分剪辑。它可能与编码器延迟和同步有关,但我真的不在我这里。

我找到了一种解决方法,即首先将视频转换为 mp4(在我的情况下,它只是将 mp4 转换为 mp4),如下所示:

ffmpeg -i input.mp4 -c:v:0 h264 input.preexport.mp4

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

这当然不理想,因为我必须浏览视频两次。

所以我想问一下是否有一个选项可以让我在生成 hls 的同时重新定时视频,或者如果有其他解决问题的方法更好。

谢谢!

托马斯

4

0 回答 0