mencoder input_file -o output_file -ss 30 -endpos 60 -oac copy -ovc copy
以上命令可以截取视频文件从30秒开始持续1分钟的内容保存到output_file。如果仔细看输出的视频,会发现视频确实恰好有一分钟,但开始时间并不是准确的原视频的第30秒。在mplayer的文档中,关于这点写到mencoder定位在离-ss指定时间最近I帧。一般对于截取视频来说这样问题不大,但如果要对分割的连接视频再合并,就会出现问题。比如,再分割
mencoder input_file -o output_file2 -ss 0 -endpos 30 -oac copy -ovc copy,
一般对output_file和output_file2再合并,视频会缺帧或重帧。为了合并得到连续的视频,可以对mencoder.c做以下修改并重新编译(修改后合并视频会出错,得用原来的可执行文件),基本原理是让视频在ss+endpos最近的I帧结束:
1. 定义变量(以下改动都是在main中)
2. 把if(seek_to_sec)处改为
3. 把 play_n_frames=play_n_frames_mf;改为play_n_frames=next_frame_no-sh_video->num_frames;
4. 注释掉if ((end_at.type == END_AT_SIZE && end_at.ps <= stream_tell(muxer->stream)) || (end_at.type == END_AT_TIME && end_at.pos < v_muxer_time)) 这个条件语句(连同下面的break)。
注:本文使用源码为2010-11-19