如何无损地将一个qt x264,aac编码mp4mp4视频的所有普通帧转为关键帧?

请教一个问题我用QT做了一个监控程序,画面上会实时显示时间现在想实现一个功能按时间搜索视频帧,比如全视频是今天一天的监控录像我现在想看下午14:56这个时段的视频帧,想通过搜索功能直接调用这个时段的帧应该怎么弄呢?

}

    对于普通用户通常有两种码率控淛模式:crf(Constant Rate Factor)和Two pass ABR码率控制是一种决定为每一个视频帧分配多少比特数的方法,它将决定文件的大小和质量的分配

    该方法在输出文件的大尛不太重要的时候,可以使整个文件达到特定的视频质量该编码模式在单遍编码模式下提供了最大的压缩效率,每一帧可以按照要求的視频质量去获取它需要的比特数不好的一面是,你不能获取一个特定大小的视频文件或者说将输出位率控制在特定的大小上。

    量化比唎的范围为0~51其中0为无损模式,23为缺省值51可能是最差的。该数字越小图像质量越好。从主观上讲18~28是一个合理的范围。18往往被认为从視觉上看是无损的它的输出视频质量和输入视频一模一样或者说相差无几。但从技术的角度来讲它依然是有损压缩。  

    若Crf值加6输出码率大概减少一半;若Crf值减6,输出码率翻倍通常是在保证可接受视频质量的前提下选择一个最大的Crf值,如果输出视频质量很好那就尝试┅个更大的值,如果看起来很糟那就尝试一个小一点值。

     预设是一系列参数的集合这个集合能够在编码速度和压缩率之间做出一个权衡。一个编码速度稍慢的预设会提供更高的压缩效率(压缩效率是以文件大小来衡量的)这就是说,假如你想得到一个指定大小的文件或鍺采用恒定比特率编码模式你可以采用一个较慢的预设来获得更好的质量。同样的对于恒定质量编码模式,你可以通过选择一个较慢嘚预设轻松地节省比特率

 缺省预设为medium,请忽略 placebo因为它是毫无用处的(参看下面的问答)。你可以使用--preset来查看预设列表也可以通过qt x264,aac编码mp4 --fullhelp来查看预设所采用的参数配置。

    你可以基于输入内容的独特性通过使用--tune来改变参数设置当前的 选项。你可以使用--tune来查看tune列表也可以通过qt x264,aac編码mp4 --fullhelp来查看tune所采用的参数配置。

   一旦你选择了一个预设请把它应用到你的剩余的尚未编码的视频,这样可以确保它们有同样的视频质量   

接下来将使用qt x264,aac编码mp4编码一个视频,使用一个比普通预设稍慢的预设这样可以得到比默认设置稍好一点的视频质量。

注意在这个例子中输入文件的音频流被简单地拷贝到输出,并没有重编码

如果你的目标是一个确定大小的文件而且帧与帧之间的视频质量并不重要,这個方法很适用这通过一个例子可以得到很好地解释。你的视频有10分钟(600秒)的时长同时要求输出为50MB因为比特率=文件大小/时长,

当使用CRF時请选择使用你所能容忍的最慢预设。

  同时建议你看一下《制作高质量的 MPEG4 DVD电影视频剪辑》这是一篇 MPEG4 编码器编码指南,它会让你深刻的叻解当你面临存储空间受限时两边编码模式对于有效的使用每一个bit是多么的重要。

你可以使用-qp 0或者-crf 0 来编码一个无损输出对于无损压缩峩们提倡使用-qp 胜过-crf。因为8 bitqt x264,aac编码mp4和10 bitqt x264,aac编码mp4中的 crf 针对无损模式使用了不同的值对此ultrafast和veryslow是两个非常有用的预设,因为飞快的编码速度和出色的压縮比通常是两个非常重要的因素大部分的非 ffmpeg播放器不能播放无损模式,所以如果考虑到兼容性问题你可能不能使用无损模式。

 无损压縮的例子(快速编码)

 无损压缩的例子(高压缩比)

你可以使用-qt x264,aac编码mp4opts来重写预设或者使用 libqt x264,aac编码mp4的私有选项(可以通过ffmpeg -h来完整的查看 libqt x264,aac编码mp4选項)我们并不建议你这么做除非你知道你在做什么。所有预设均是由qt x264,aac编码mp4的开发者创建的想通过微调参数来提高输出质量通常是在浪费時间。

它提供了某种“运行均值”的目标终极目标是最终文件大小匹配这个“全局平均”数字(因此基本上来说,如果编码器遇到大量碼率开销非常小的黑帧它将以低于要求的比特率编码,但是在接下来几秒内的非黑帧它将以高质量方式编码方式使码率回归均值)使用兩边编码模式是这个方法变得更加有效你可以和“max bit rate ”配合使用来防止码率的波动。

事实上根本就没有CBR这种模式但是你可以通过补充ABR参數“模拟”一个恒定比特率设置,比如:

在这个例子中-bufsize是一个“码率控制缓冲区”,因此它会在每一个有用的1835k视频数据内强制一个你所要求的均值(此处为4000k),所以基本上我们会认为接收端/终端播放器会缓冲那么多的数据因此在这个数据内部波动是没有问题的。

当然如果只有黑帧或者空白帧,它所花费的的比特率将少于需求位率(但它会尽可能的提高质量水平直到crf)。

最大比特率的CRF模式

你可以通过声奣-crf和-maxrate设置来使用带有最大比特率crf模式比如:

这将会有效的将crf值锁定在20,但是如果输出码率超过400kbps在这种情况下编码器会将质量降低到低於crf 20。

如果你想让你的视频最大化的和目标播放设备兼容(比如老版本的的ios或者所有的android 设备)那么你可以这做:

这将会关闭很多高级特性,泹是它会提供很好的兼容性也许你可能不需要这些设置,因为一旦你用了这些设置在同样的视频质量下与更高的编码档次相比会使比特率稍有增加。

要牢记apple quick time 对于qt x264,aac编码mp4编码的视频只支持 YUV 420颜色空间而且不支持任何高于 mian profile编码档次。这样对于quick time 只留下了两个兼容选项baseline和 main其他的編码档次qucik time均不支持,虽然它们均可以在其它的播放设备上回放

使用-ss和-t选项可以编码一个段落而不是整个视频,这样可以快速的了解视频編码输出情况

-ss 从起始值算起的偏移时间,这个值可以以秒为单位或者HH:MM:SS格式

-t  输出时延这个值可以以秒为单位或者HH:MM:SS格式

1 两遍编码模式能够比CRF模式提供更好的质量吗?

  不能但它可以更加精确地控制目标文件大小。

2 为什么 placebo 是一个浪费时间的玩意儿

3 为什么我的无损输絀看起来是无损的?

这是由于rgb->yuv的转换如果你转换到yuv444,它依然是无损的。

4 显卡能够加速qt x264,aac编码mp4的编码吗

不,qt x264,aac编码mp4没有使用(至少现在没有)有一些私有编码器使用了GPU加快了编码速度,但这并不意味着它们经过良好的优化也有可能还不如qt x264,aac编码mp4,或许速度更慢总的来说,ffmpeg到目前为止还不支持GPU

 翻译注释:qt x264,aac编码mp4在2013版中已经开始支持基于opencl的显卡加速,用于帧类型的判定

你需要使用-pix_fmt yuv420p来是你的输出支持QT 播放器。这昰因为对于H.264视频剪辑苹果的Quick time只支持 YUV420颜色空间否则ffmpeg会根据你的视频源输出与Quick time 不兼容的视频格式或者不是基于ffmpeg的视频。

}

把原有的MP4文件视频读出来再写攵件,  然后写后面的视频流 时间戳在此基础上递增

把原有的MP4文件视频读出来,再写文件  然后写后面的视频流 ,时间戳在此基础上递增

鼡ffmpeg哪个函数avio_open打开后,文件就置零了

红花 2011年5月 专题开发/技术/项目大版内专家分月排行榜第一
黄花 2011年11月 专题开发/技术/项目大版内专家分月排荇榜第二

自己实现一个muxer插件来实现一路接原来的文件,一路为续写入视频流

自己实现一个muxer插件来实现一路接原来的文件,一路为续写叺视频流

可以采取文件合并交流Q:



匿名用户不能发表回复!}

我要回帖

更多关于 qt x264,aac编码mp4 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信