看到这个需求,第一个想到的就是用ffmpeg去转换,百度了一番,基本上都是类似与下面这条命令:
ffmpeg -i 20201124023926196.mp4 -vf "drawtext=expansion=strftime:basetime=$(date +%s -d '2020-11-24 16:27:50')000000 :text='%Y-%m-%d %H\\:%M\\:%S':fontsize=18:fontcolor=white:box=1:x=100:y=100:boxcolor=black@0.5:" -strict -2 -y out.mp4
执行后,可以发现时间戳并不是从指定的"2020-11-24 16:27:50"基准时间开始的,这是什么原因呢?于是又从git上查找相关的资料,发现是basetime格式的问题, basetime是int(64)类型的,精确到微秒, 一定要注意这一点。
其它参数说明:
-i: 指定输入文件,这里使用的视频编码是H264, 音频编码是AAC
-vf: 视频滤镜,使用了drawtext滤镜,basetime是视频时间戳的初始值,text是显示时间的格式,fontsize后面一串是关于水印的颜色、字体、背景等设置
-strict -2:AAC的解码在2.x版本是试验性功能,需要加这个参数
-y: 覆盖已经存在的输出文件
基本选项:-formats输出所有可用格式-ffmt指定格式(音频或视频格式)-ifilename指定输入文件名,在linux下当然也能指定:0.0(屏幕录制)或摄像头-y覆盖已有文件-tduration记录时长为t-fslimit_size设置文件大小上限-sstime_off从指定的时间(s)开始,[-]hh:mm:ss[.xxx]的格式也支持-itsoffsettime_off设置时间偏移(s),该选项影响所有后面的输入文件。该偏移被加到输入文件的时戳,定义一个正偏移意味着相应的流被延迟了offset秒。[-]hh:mm:ss[.xxx]的格式也支持-titlestring标题-timestamptime时间戳-authorstring作者-copyrightstring版权信息-commentstring评论-albumstringalbum名-vverbose与log相关的-targettype设置目标文件类型("vcd","svcd","dvd","dv","dv50","pal-vcd","ntsc-svcd",)-dframesnumber设置要记录的帧数视频选项:-b指定比特率(bits/s),似乎ffmpeg是自动VBR的,指定了就大概是平均比特率-bitexact使用标准比特率-vb指定视频比特率(bits/s)-vframesnumber设置转换多少桢(frame)的视频-rrate帧速率(fps)(可以改,确认非标准桢率会导致音画不同步,所以只能设定为15或者29.97)-ssize指定分辨率(320x240)-aspectaspect设置视频长宽比(4:3,16:9or1.3333,1.7777)-croptopsize设置顶部切除尺寸(inpixels)-cropbottomsize设置底部切除尺寸(inpixels)-cropleftsize设置左切除尺寸(inpixels)-croprightsize设置右切除尺寸(inpixels)-padtopsize设置顶部补齐尺寸(inpixels)-padbottomsize底补齐(inpixels)-padleftsize左补齐(inpixels)-padrightsize右补齐(inpixels)-padcolorcolor补齐带颜色(000000-FFFFFF)-vn取消视频-vcodeccodec强制使用codec编解码方式('copy'tocopystream)-sameq使用同样视频质量作为源(VBR)-passn选择处理遍数(1或者2)。两遍编码非常有用。第一遍生成统计信息,第二遍生成精确的请求的码率-passlogfilefile选择两遍的纪录文件名为file-newvideo在现在的视频流后面加入新的视频流高级视频选项-pix_fmtformatsetpixelformat,'list'asargumentshowsallthepixelformatssupported-intra仅适用帧内编码-qscaleq以质量为基础的VBR,取值0.01-255,约小质量越好-loop_input设置输入流的循环数(目前只对图像有效)-loop_output设置输出视频的循环数,比如输出gif时设为0表示无限循环-gint设置图像组大小-cutoffint设置截止频率-qminint设定最小质量,与-qmax(设定最大质量)共用,比如-qmin10-qmax31-qmaxint设定最大质量-qdiffint量化标度间最大偏差(VBR)-bfint使用framesB帧,支持mpeg1,mpeg2,mpeg4音频选项:-ab设置比特率(单位:bit/s,也许老版是kb/s)前面-ac设为立体声时要以一半比特率来设置,比如192kbps的就设成96,转换默认比特率都较小,要听到较高品质声音的话建议设到160kbps(80)以上。-aframesnumber设置转换多少桢(frame)的音频-aqquality设置音频质量(指定编码)-arrate设置音频采样率(单位:Hz),PSP只认24000-acchannels设置声道数,1就是单声道,2就是立体声,转换单声道的TVrip可以用1(节省一半容量),高品质的DVDrip就可以用2-an取消音频-acodeccodec指定音频编码('copy'tocopystream)-volvolume设置录制音量大小(默认为256),某些DVDrip的AC3轨音量极小,转换时可以用这个提高音量,比如200就是原来的2倍-newaudio在现在的音频流后面加入新的音频流字幕选项:-sn取消字幕-scodeccodec设置字幕编码('copy'tocopystream)-newsubtitle在当前字幕后新增-slangcode设置字幕所用的ISO639编码(3个字母)Audio/Video抓取选项:-vcchannel设置视频捕获通道(只对DV1394)-tvstdstandard设置电视标准NTSCPAL(SECAM)要得到一个高画质音质低容量的MP4的话,首先画面最好不要用固定比特率,而用VBR参数让程序自己去判断,而音质参数可以在原来的基础上提升一点,听起来要舒服很多,也不会太大(看情况调整)转换为flv:ffmpeg-itest.mp3-ab56-ar22050-b500-r15-s320x240test.flvffmpeg-itest.wmv-ab56-ar22050-b500-r15-s320x240test.flv转换文件格式的同时抓缩微图:ffmpeg-i"test.avi"-y-fimage2-ss8-t0.001-s350x240'test.jpg'对已有flv抓图:ffmpeg-i"test.flv"-y-fimage2-ss8-t0.001-s350x240'test.jpg'转换为3gp:ffmpeg-y-itest.mpeg-bitexact-vcodech263-b128-r15-s176x144-acodecaac-ac2-ar22500-ab24-f3gptest.3gpffmpeg-y-itest.mpeg-ac1-acodecamr_nb-ar8000-s176x144-b128-r15test.3gp例:ffmpeg-y-i"test.avi"-title"Test"-vcodecxvid-s368x208-r29.97-b1500-acodecaac-ac2-ar24000-ab128-vol200-fpsp-muxvb768"test.***"#参数解释:-y(覆盖输出文件,即如果1.***文件已经存在的话,不经提示就覆盖掉了)-i"1.avi"(输入文件是和ffmpeg在同一目录下的1.avi文件,可以自己加路径,改名字)-title"Test"(在PSP中显示的影片的标题)-vcodecxvid(使用XVID编码压缩视频,不能改的)-s368x208(输出的分辨率为368x208,注意片源一定要是16:9的不然会变形)-r29.97(帧数,一般就用这个吧)-b1500(视频数据流量,用-bxxxx的指令则使用固定码率,数字随便改,1500以上没效果;还可以用动态码率如:-qscale4和-qscale6,4的质量比6高)-acodecaac(音频编码用AAC)-ac2(声道数1或2)-ar24000(声音的采样频率,好像PSP只能支持24000Hz)-ab128(音频数据流量,一般选择32、64、96、128)-vol200(200%的音量,自己改)-fpsp(输出psp专用格式)-muxvb768(好像是给PSP机器识别的码率,一般选择384、512和768,我改成1500,PSP就说文件损坏了)"test.***"(输出文件名,也可以加路径改文件名)欢迎分享,转载请注明来源:内存溢出
评论列表(0条)