Answers:
要准确工作,首先将视频转换为RAW YUV比特流(如果尚未):
ffmpeg -i input.mp4 -an -vcodec rawvideo -pix_fmt yuv420p rawbitstream.yuv
ffmpeg -r 2 -s WxH -i rawbitstream.yuv -filter:v select="mod(n-1\,2)" \
-c:v rawvideo -r 1 -format rawvideo -pix_fmt yuv420p -an odd.yuv
ffmpeg -r 2 -s WxH -i rawbitstream.yuv -filter:v select="not(mod(n-1\,2))" \
-c:v rawvideo -r 1 -format rawvideo -pix_fmt yuv420p -an even.yuv
要ffmpeg
没有重复帧,您必须强制输入的帧速率的一半 - 因此您将“2”设置为输入,将“1”设置为输出。不要忘记将WxH替换为剪辑的实际尺寸,因为原始比特流没有包含此信息的标题。
除了上述内容,另一种可能性是添加setpts
过滤器以设置输出的新时间戳。但要小心,因为它不准确地丢帧。这里,25是你想要的实际输出帧速率:
ffmpeg -i input.mp4 -filter:v select="mod(n-1\,2)",setpts="N/(25*TB)" \
-c:v rawvideo -r 12.5 -format rawvideo -pix_fmt yuv420p -an odd.yuv
ffmpeg -i input.mp4 -filter:v select="not(mod(n-1\,2))",setpts="N/(25*TB)" \
-c:v rawvideo -r 12.5 -format rawvideo -pix_fmt yuv420p -an even.yuv
您当然可以选择其他像素格式(任何一种ffmpeg -pix_fmts
)。确保在读取文件时您知道像素大小和像素格式:
ffmpeg -f rawvideo -s:v 1280x720 -pix_fmt yuv420p input.yuv …
如果您的ffmpeg是使用AviSynth标志构建的,那么我相信您可以传递一个.avs
文件。
您可以通过在配置数据中运行ffmpeg
和查找来--enable-avisynth
进行检查。
如果它在那里你就可以这样使用它:ffmpeg -i blahEven.avs blahEven.yuv
。
其中blahEven.avs
无非是:
ffvideosource( “blah.yuv”)。SelectEven()
对于奇数帧,请使用SelectOdd()
。
有关更多优先用途,请参阅SelectEvery文档。
--enable-avisynth
在那里,那就意味着AviSynth被内置到ffmpeg中,但我不确定。