作者:DZ2017 | 来源:互联网 | 2023-09-05 07:58
我在创建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文件(在野生动物园中打开以观看它的播放):http://tomaskohout.cz/bunny/bunny.m3u8
问题在于,第一次剪切后,音频会重叠且不同步(请注意,螺母敲打鸟的声音播放了两次),最后一秒只是静止帧。
用于比较的原始视频在这里:
http://tomaskohout.cz/bunny/original.mov
似乎这通常是AVFoundation中的问题。如果您使用QuickTime(使用“编辑”>“将片段添加到末尾”)加入两个片段,并将生成的视频用作ffmpeg的输入,则音频和视频也将不同步。似乎它会生成一些奇怪的定时视频,只有quicktime知道如何播放。如果您拍摄原始视频并尝试使用VLC播放,则它也将不同步,甚至会显示剪辑片段中原本不是原始片段的部分。它可能与Encoder Delay and Synchronization有关,但我确实不在这里。
我找到了一种解决方法,首先将视频转换为mp4(在我的情况下,就是将mp4转换为mp4),
ffmpeg -i input.mp4 -c:v:0 h264 input.preexport.mp4
,然后使用预导出的版本生成m3u8文件。这似乎可以正确地重新计时视频。
那当然不是理想的,因为我必须两次播放视频。
所以我想问问是否有一个选项可以让我在生成hls的同时重新计时视频,或者是否还有其他解决方法。
谢谢!
Tomas