我正在尝试延长视频的第一帧,并使用 ffmpeg 和 ffmpeg2theora 将其编码为 Ogg Theora。这是我目前使用的大多数情况下都有效的脚本:
//Extract first frame, make short video clip
ffmpeg.exe -i video.mov -c:v copy -c:a pcm_s16le firstFrame.png
ffmpeg.exe -f lavfi -i aevalsrc=0 -loop 1 -i firstFrame.png -c:v libx264 -preset veryslow -pix_fmt yuv420p -t 00:00:00.500 -c:a pcm_s16le halfSecondFreeze.mov
//For concatenation to work, I need the same audio format in both videos
//or else ffmpeg2theora will fail
ffmpeg.exe -i video.mov -c:v copy -c:a pcm_s16le fixedAudioVideo.mov
ffmpeg.exe -i halfSecondFreeze,mov -i fixedAudioVideo.mov -filter_complex \"[0:0] [0:1] [1:0] [1:1] concat=n=2:v=1:a=1:unsafe=1 [v] [a]\" -map \"[v]\" -map \"[a]\" -c:v libx264 -preset veryslow -c:a pcm_s16le frameLengthenedVideo.mov
//Encode to theora in ogv container
ffmpeg2theora.exe frameLengthenedVideo.mov -c 1 -x 800 -y 600 -o finalVid.ogv
问题是,有时候,这会切断一些视频的最后一部分。我发现,如果我qtrle
在制作短片时使用 作为编解码器,那么在连接两个视频时,最终的视频会提前切断。相反,它会产生非常不连贯的视频。
我使用ffmpeg2theora
它来转换为 ogv,因为它似乎是唯一一款能够生成我的播放应用程序 (Unity3d) 喜欢的视频的工具。ffmpeg
直接使用会导致奇怪的播放问题,例如视频完全变黑。
我正在寻找有关如何避免截止问题或改进此过程的任何建议。如果您想了解某个失败视频的任何详细信息,我可以在此处粘贴 MediaInfo 的相关输出。
答案1
考虑将音频复制到其自己的输入中,并使用与原始输入文件相同的容器。
可能的解决方案。将音频复制到单独的文件。创建 png。将它们混合在一起。然后将其与原始文件连接起来。
ffmpeg -i *.mov -c copy -map 0:a audio.mov
ffmpeg -i video.mov -c:v copy -frames:v 1 firstFrame.png
ffmpeg -loop 1 -i firstFrame.png -i audio.mov -t 0.5 -map 0:v:0 -c:a copy -map 1:a:0 png.mov
对于 concat 我会使用这个答案来自 Stack Overflow。
我省略了一些内容,但基本思路是这样的。你可以跳过将音频移至单独文件的步骤,但我想强调这一步。除非迫不得已,否则尽量避免转码,复制是你的好朋友。