如何使用FFmpeg进行时间戳定位
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用FFmpeg进行时间戳定位相关的知识,希望对你有一定的参考价值。
参考技术A 基本选项:-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.***"(输出文件名,也可以加路径改文件名)如何与 JPA 查询进行时间戳比较?
【中文标题】如何与 JPA 查询进行时间戳比较?【英文标题】:How to do a timestamp comparison with JPA query? 【发布时间】:2011-02-02 02:24:46 【问题描述】:我们需要确保 JPQL 查询只返回过去 30 天内的结果。下面是一个例子:
Date now = new Date();
Timestamp thirtyDaysAgo = new Timestamp(now.getTime() - 86400000*30);
Query query = em.createQuery(
"SELECT msg FROM Message msg "+
"WHERE msg.targetTime < CURRENT_TIMESTAMP AND msg.targetTime > ts, '"+thirtyDaysAgo+"'");
List result = query.getResultList();
这是我们收到的错误:
<907835>907835>【参考方案1】:
所以您输入的查询不是 JPQL(您可以通过参考 JPA 规范看到)。如果要将字段与日期进行比较,则输入日期作为查询的参数
msg.targetTime < CURRENT_TIMESTAMP AND msg.targetTime > :param
这不是 SQL。
【讨论】:
对于此处记录的 JPA 实现,这是有效的 JPQL:openjpa.apache.org/builds/latest/docs/manual/… 使用“JDBC 转义语法”。您应该考虑对尝试使用新技术的人表示同情。 是的,你是对的;我忘记了 RDBMS JPQL 是多么具体。建议仍然是避免这种语法,因为根据 JPA 规范,您依赖于支持它的 JDBC 驱动程序,并且使用参数查询实际上要干净得多。 提供引用。【参考方案2】:您使用的 OpenJPA 版本可能不支持 JDBC 转义语法。最新 1.2.x 版本的文档在这里:http://openjpa.apache.org/builds/1.2.2/apache-openjpa-1.2.2/docs/manual/manual.html#jpa_langref_lit。
前面提到的文档是指 OpenJPA 2.0.0(最新)的文档:http://openjpa.apache.org/builds/latest/docs/manual/jpa_langref.html#jpa_langref_lit
也就是说,您有什么理由要在您的 JPQL 中注入一个字符串?像下面的sn-p这样的东西呢?
Date now = new Date();
Date thirtyDaysAgo = new Date(now.getTime() - (30 * MS_IN_DAY));
Query q = em.createQuery("Select m from Message m "
+ "where m.targetTime < :now and m.targetTime > :thirtyDays");
q.setParameter("now", now);
q.setParameter("thirtyDays", thirtyDaysAgo);
List<Message> results = (List<Message>) q.getResultList();
【讨论】:
我更喜欢使用参数“now”而不是 DataNucleus 建议中的 JPQL 函数“current_timestamp”,因为该函数返回数据库服务器上的时间,而 new Date() 返回数据库服务器上的时间Java 容器。如果它们不是同一台机器,当时钟不同步时,这可能会导致错误。 仅供参考,在 JPQL 中,您可以使用 TypedQuery 来避免强制转换。以上是关于如何使用FFmpeg进行时间戳定位的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 C#/.NET 将日期时间转换为时间戳(忽略当前时区)