ffmpeg可以烧时间码吗?我需要将时间码刻录到视频中,想知道ffmpeg是否能够做到这一点?简短的回答,没有。答案很长,是的,但并非没有使用单独的库来创建带有渲染时间码的帧,用透明度填充帧的其余部分,然后使用FFmpeg覆盖现有视频上的帧。我不知道该怎么做,但我敢肯定,如果您有创意,就可以解决。编辑:我一直在研究这个,因为这对我来说是一个有趣的问题/项目。我更进一步,编写了一个Perl脚本,该脚本将为任何给定的视频文件生成一个带有嵌入式时间码的.srt文件,FFmpeg配置为能够读取元数据。它使用Video::FFmpeg库读取时长并将字幕文件保存为${video}.srt。如果在~/.mplayer/config中插入以下行,这将使其在Mplayer中自动呈现:#自动选择当前目录中的字幕文件,所有文件#匹配当前播放文件的基本名称sub-fuzziness=1Still研究如何在视频上定位和叠加渲染的字幕并以相同的格式重新编码。我会更新这篇文章,因为我知道更多。FFMPEG的drawtextfilter对我有用,你可以指定起始时间码及其格式:-vfdrawtext="fontsize=15:fontfile=/Library/Fonts/DroidSansMono.ttf:timecode='00:00:00:00':rate=25:text='TCR:':fontsize=72:fontcolor='white':boxcolor=0x000000AA:box=1:x=860-text_w/2:y=960"你必须以hh:mm:ss[:;,]ff的形式指定了时间码格式。请注意,您必须转义时间码格式字符串中的冒号,并且必须指定时间码速率(此处为25fps)。您还可以指定其他文本-这里是“TCR:”您可以使用ffprobe和一些shellfu获取帧速率:frame_rate=$(ffprobe-i"movie.mov"-show_streams2>&1|grepfps|sed"s/.*,([0-9.]*)fps,.*/1/")因此您可以轻松地将它们一起插入到批处理脚本中,例如foriin*.movframe_rate=$(ffprobe-i"$i"-show_streams2>&1|grepfps|sed"s/.*,([0-9.]*)fps,.*/1/")clipname=${(basename"$i")/.*/}ffmpeg-i"$i"-vcodecwhatever-acodecwhatever-vfdrawtext="fontsize=15:fontfile=/Library/Fonts/DroidSansMono.ttf:timecode='00:00:00:00':rate=$frame_rate:text='$clipname'TCR:':fontsize=72:fontcolor='white':boxcolor=0x000000AA:box=1:x=860-text_w/2:y=960""${i/.mov/_tc.mov}"done这会将剪辑的名称和滚动时间码添加到1920x1080帧底部中心的半透明框中黑暗面,我现在在WindowsPowershell环境中这样做,这就是我使用的:ls-R-File-filter*.M*|%{ffmpeg-n-i$_.fullname-vfdrawtext="fontsize=72:x=12:y=12:`timecode='00:00:00:00':rate=25:fontcolor='white':`boxcolor=0x000000AA:box=1"`("c:pathtodestination{0}"-F($_.name-replace'M[OPT][V4S]','mp4'))}这将创建包含.MOV、.MP4和.MTS文件的文件夹的mp4(使用-filter命令查找名称中带有*.M*的文件,如果您正在处理.AVI文件,则必须更改它),而且它有点小,它只是使用默认的libx264作为输出编解码器,并没有指定字体等。在这种情况下,时间码被刻录在帧的左上角。@stib的回答中提到的drawtextfilter是插入时间的关键。但是,使用时间码选项与挂钟时间不匹配。如果你的r(timecode_rate)参数错误,那么你的时间将与你的播放时间不匹配。存在其他选项,例如text='%{prt}'选项允许您以微秒精度显示经过的时间。命令:ffmpeg-ivideo.mp4-vf"drawtext=text='%{prt}'"output.mp4为了获得时钟,我不得不使用已弃用的strftime选项。这有一个未记录的basetime选项,可用于以微秒为单位设置开始时间。我将开始时间设置为2013年12月12日凌晨12:00的示例($(...)部分是由shell完成的shell扩展)并仅显示时间(有关可能的格式,请参见strftime手册):ffmpeg-ivideo.mp4-vf"drawtext=expansion=strftime:basetime=$(date+%s-d'2013-12-0112:00:00')000000:text='%H\:%S\:%S'"output.mp4\:forescape:否则获取选项分隔符的含义。另一个例子:在黑框中插入日期+时间的命令,距离左上角一些像素和“一些填充”(实际上,两个空格和边缘的换行符):newline=$'r'ffmpeg-ivideo.mp4-vf"drawtext=x=8:y=8:box=1:fontcolor=white:boxcolor=black:expansion=strftime:basetime=$(date+%s-d'2013-12-0112:00:00')000000:text='$newline%Y-%m-%d%H\:%M\:%S$newline'"output.mp4另一个获得微秒以下时间的例子:newline=$'r'ffmpeg-ivideo.mp4-vf"drawtext=expansion=strftime:basetime=$(date+%s-d'2013-12-0112:00:00')000000:text='$newline%H\:%M\:%S$newline':fontcolor=white:box=1:boxcolor=black,drawtext=text='$newline%{pts}$newline':y=2*th/3:box=1:fontcolor=white:boxcolor=black:"output.mp4这利用了文本实际上是三行长的事实,并且两个文本都有一个前缀和额外的换行符(回车,^M)。(没有这个换行符,空间被剥离)附加提示:在较新的版本中,您可以使用drawtextfilter(我相信其示例中的“t”,帧的时间戳)插入文本。它还适用于“当前”系统时间的srtftime。我找到的最简单的解决方案是在捕获文件时显示时钟,而不是它的持续时间,并且基于这篇文章,它起作用了/谢谢!/isD:Temp2>ffmpeg.exe-itest.avi-vf"drawtext=fontfile=C\:/Windows/Fonts/arial.ttf:timecode='00:20:10:00':rate=25:text='TCR:':fontsize=46:fontcolor=white:x=500:y=50:box=1:boxcolor=0x00000000@1"-fmp4textts.mp4时间码就是这么简单——输入你的开始时间,然后计数是正常的!该示例适用于Windows这是我的解决方案,我认为这是正确的,因为它既避免了手动设置速率又允许您格式化输出。ffmpeg-itest.mp4-vf"drawtext=fontfile=arialbd.ttf:text='%{pts:gmtime:0:%H\:%M\:%S}'"test.avi这会产生HH:MM:SS格式的邮票;您可以使用strftime将其更改为您想要的任何内容。看起来它可能会将时间戳放在gmtime中,但事实并非如此。它实际上将视频的当前时间(以秒为单位)提供给gmtime,产生1970年1月1日的日期,然后是午夜后的几秒钟。所以你只需扔掉日期部分并使用时间部分。请注意pts函数中的三重转义冒号,如果您像我上面那样输入它,就必须这样做。您还可以看到,我复制了ArialBold的字体文件并将其直接放在工作目录中,以简化操作。FFMPEG将能够完成大部分工作,但不会打包所有工作。使用FFMPEG,您可以按顺序解码所有帧,这会给您一个“演示时间戳”(某些格式可能会提供额外的与时间相关的元数据,但PTS是您想要开始寻找的。)然后,您可以自己做实际上将文本绘制到解码帧上。我将Qt用于类似的事情,使用QPainter和QImage上的帧数据,但可能还有一些其他API用于在您发现更明显的图像上绘图。然后,使用FFMPEGAPI制作带有新绘制帧的压缩视频。如果你也想要音频,那就有点复杂了。我不太关心我自己工作的音频,所以我没有费心去学习API的音频方面。基本上,当您执行读取循环以从文件中获取数据包时,其中一些将是音频。不要像我那样丢弃它们,您需要保留它们并将它们写入输出文件。我只使用CAPI,没有使用C#,所以我不知道是否有任何需要担心的特殊问题。以上就是C#学习教程:ffmpeg可以烧写时间码吗?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
