V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
est
V2EX  ›  汽车

去一个景点开了一圈,想用行车记录仪存档,所以有个奇怪的需求

  •  
  •   est · 2016-01-03 21:33:13 +08:00 · 3020 次点击
    这是一个创建于 3248 天前的主题,其中的信息可能已经有所发展或是发生改变。
    去一个景点开了一圈,风景还行,想留个纪念。从行车记录仪拷出来,发现为了防止漏秒,每个视频都多了 1 秒。。。。 1080p 合并出来 5G 多,也太大了。折腾了一下 ffmpeg 压缩 720p ,发现速度只有 32fps 。这尼玛慢死人了啊。

    家里没有 i7 的强力 PC ,只能用 mbp 慢慢处理。郁闷啊。


    想达到以下目的:

    1. 4x 倍速播放
    2. 60fps
    3. 减小体积, 720p 足够了。
    4. 去掉多出的 1 秒。。。。

    有没有能一次性做完这些步骤的软件啊?
    第 1 条附言  ·  2016-01-05 22:33:35 +08:00

    特大喜讯, ffmpeg git 版本支持新的 concatdec_select 这个 vf ,一次性全搞定了。不用临时文件

    先建立个 list.txt 例如

    file 'input1.mp4'
    outpoint 300
    file 'input2.mp4'
    outpoint 300
    file 'input3.mp4'
    outpoint 300
    ...
    file 'inputn.mp4'
    outpoint 300
    

    然后:

    ffmpeg -f concat -i "list.txt" -r 48 -vf "select=concatdec_select,scale=1280x720,setsar=1,setpts=0.125*PTS" -sws_flags lanczos -c:v libx264 -crf 23 -an "merged-720p.mp4"
    

    我来逐个解释下参数意思:

    • -r 48 帧 frame per second
    • -vf video filter
    • select=concatdec_select 好像是合并+解码+选择
    • scale=1280x720 拉伸分辨率
    • setsar 拉伸选项
    • setpts 提速
    • sws_flags 这里是选重采样算法。 lanczos 是著名的效果好的。
    • -c:v 这里是选择牛逼的 x264
    • -crf 这里不是选择恒定码率,而是选择恒定质量 23 算一个比较常见的设定
    • -an 去掉声音

    我实验了,效果很好。

    58 条回复    2016-01-05 23:17:56 +08:00
    old9
        1
    old9  
       2016-01-03 21:47:21 +08:00 via Android
    也就 ffmpeg 了……
    loading
        2
    loading  
       2016-01-03 21:48:53 +08:00 via Android
    windows 有绘声绘影这些。
    osx 应该也有的,就是视频编辑器。

    adobe after effect 上手难度有点高…
    skydiver
        3
    skydiver  
       2016-01-03 21:50:16 +08:00
    比较好上手功能又强的软件,我用过一个 Sony Vegas ,不知道现在还有不
    loading
        4
    loading  
       2016-01-03 21:50:35 +08:00 via Android
    工具是有,但是 ffmpeg 是根本,算法摆在那里,快不起来的。

    网速快就传到 youtube 上,等它转好,下个流畅版本…哈哈
    tanyuxiang
        5
    tanyuxiang  
       2016-01-03 21:50:56 +08:00 via Android
    为啥不用 1080p 30fps
    est
        6
    est  
    OP
       2016-01-03 21:54:19 +08:00
    @loading youtube 没法合并视频,这里还要去掉每个视频之间多出的冗余 1 秒。如果暴力合并,会发现视频抖一下。


    @tanyuxiang 节省体积。没那个必要。况且 720p 效果已经很好了。行车记录仪的 1080p 很粗糙的。
    est
        7
    est  
    OP
       2016-01-03 21:57:10 +08:00
    而且我发现我 15 分钟的 720p ,就是 500MB 。而且画面大多数都是路面。。。。按理来说重复度很高啊。

    真心觉得网上压电视剧的, 400M 近一个小时的 H.264 ,真心技术牛逼啊。我是不是哪里参数没调对啊。。。 orz 。。。。。。。。。。况且我还去掉了声音的啊。

    我的参数:

    ffmpeg --i "original_1080p.mp4" -vf scale=1280x720,setsar=1 -sws_flags lanczos -c:v libx264 -crf 23 -an "720p.mp4"
    old9
        8
    old9  
       2016-01-03 22:02:37 +08:00 via Android
    crf 可再大点,可先压个 1 分钟看看可能接受。
    多出来的一秒,考虑到关键帧的问题,估计很难切完美,将就将就吧
    old9
        9
    old9  
       2016-01-03 22:04:27 +08:00 via Android
    4x 要再加个 filter
    60fps 也没看明白,这需求 25fps 就够了吧?
    est
        10
    est  
    OP
       2016-01-03 22:05:52 +08:00
    @old9 弄个倍速播放的。比如 15 分钟看完原来 1 个小时的行程这种。估计要 60fps 才流畅?

    crf 我再调调试试。主要是手工去掉视频最后一秒太痛苦了。还有一大堆临时中间文件。
    old9
        11
    old9  
       2016-01-03 22:12:00 +08:00 via Android
    理论上 60fps 是流畅点,但是行车记录仪估计 25fps 也看不出什么区别…

    写个脚本用 ffmpeg 切,就是切的效果未必好。
    XianZaiZhuCe
        12
    XianZaiZhuCe  
       2016-01-03 22:17:08 +08:00 via Android
    没看懂,就是处理视频的需求? premiere pro 6 ?
    Eleutherios
        13
    Eleutherios  
       2016-01-03 23:50:54 +08:00
    @est 为何不先拿 Y2B 转换格式再手动删除冗余+合并视频?
    sennes
        14
    sennes  
       2016-01-04 00:41:05 +08:00   ❤️ 1


    先拼起来.然后 50ms 左右间隔取图像出来做 gif 可以么?
    不过不管怎么做,想节省处理的总时间还是有点难度的。
    momou
        15
    momou  
       2016-01-04 00:55:22 +08:00 via Android
    貌似会声会影可以做到,许久不用了
    sennes
        16
    sennes  
       2016-01-04 00:55:22 +08:00   ❤️ 3
    我这个视频 48 秒,然后刚刚以 1000ms 为间隔取图像出来做 gif



    虽然看起来挺卡的,不过用来给风景留个纪念应该还可以吧?
    不知道能不能帮到您。

    @livid 抱歉打扰下,我刚刚上传这个 gif 一直提示上传错误。最后发现其实都有上传而且铜板也重复扣了 8 次,心疼。
    xuhaoyangx
        17
    xuhaoyangx  
       2016-01-04 01:39:56 +08:00   ❤️ 1
    crf 输出的大小,是根据画面复杂程度,清晰程度等等而定。
    高清,画面简单, crf 23 有可能就才 100M.
    清晰度不高,画面复杂(举个例:动作片,晚会灯光狂闪), crf 23 有可能就要几个 G
    其次 X264 的其他参数也会影响

    ffmpeg --i "original_1080p.mp4" -vf scale=1280x720,setsar=1 -sws_flags lanczos -c:v libx264 -crf 23

    加-preset 9 -x264opts ref=5:bframes=5:me=umh:merange=24:aq-strength=0.8:qcomp=0.5:aq-mode=2 -psy-rd 0.3:0

    -an "720p.mp4"

    比较通用的高压参数
    xuhaoyangx
        18
    xuhaoyangx  
       2016-01-04 01:42:42 +08:00
    忘了说 1280:720 这样比较规范,或者直接用-1 : 720 保留原视频的长宽比
    KexyBiscuit
        19
    KexyBiscuit  
       2016-01-04 02:55:37 +08:00 via Android   ❤️ 2
    Try Microsoft Hyperlapse
    20150517
        20
    20150517  
       2016-01-04 04:36:57 +08:00
    aws 上好像有一个服务是视频压缩的,不过取决于你上传又要多久....
    yangff
        21
    yangff  
       2016-01-04 09:05:38 +08:00
    用 GPU 压吧……
    est
        22
    est  
    OP
       2016-01-04 09:15:05 +08:00
    @yangff 质量差。。。
    est
        23
    est  
    OP
       2016-01-04 09:22:18 +08:00
    @KexyBiscuit 居然出 mac 版了。上次去看还只有 win 版的。
    yangff
        24
    yangff  
       2016-01-04 09:27:10 +08:00
    @est 码率调高就好了,并不差……
    congeec
        25
    congeec  
       2016-01-04 09:31:17 +08:00
    ffmpeg 能搞定你全部的需求,效果不理想是你参数没调好
    est
        26
    est  
    OP
       2016-01-04 09:39:48 +08:00
    @congeec 目前用的就是 ffmpeg 。去掉那一秒有中间文件,合并视频又一个中间文件,想要一个能直接一次性搞定的办法。
    ruoyu0088
        27
    ruoyu0088  
       2016-01-04 10:06:49 +08:00
    用 blender 的视频编辑,用 Python 写一个脚本自动生成时间线。至于处理效率就不清楚了,不过只需要写一次程序,就可以大批量编辑视频了,而且没有中间文件。
    chinuno
        28
    chinuno  
       2016-01-04 10:09:24 +08:00
    写个 avs 脚本,可以直接预览结果确认效果可以了用 megui 压制。第一个需求我没用过不太清楚能不能实现,不过下面三个肯定可以了
    mhycy
        29
    mhycy  
       2016-01-04 10:20:05 +08:00
    如果是刚好一秒且帧率恒定(例如都是多出 24 帧)
    可通过写 AVS 解决,所有文件按顺序编号命名,写个小脚本生成 AVS 的链接处理语句。
    然后调用 ffmpeg 编码这个 avs ,如果是 win ,建议使用 megui ,即便没有 win ,也能虚拟机装一个生成命令。
    水果有没有 x264 编码器就不知道了。

    具体压制参数,有很多论坛讨论。。。
    但是,高质量的都很慢。

    另: 5G 很大么?
    est
        30
    est  
    OP
       2016-01-04 10:38:40 +08:00
    @mhycy 5G 的视频,才不到一个小时。我觉得很大啊。网上 720p 的电影, 2 个小时,也不过 2G 么。。。。。。。。。。为啥差距这么大。
    MindPunk
        31
    MindPunk  
       2016-01-04 10:55:36 +08:00
    @est 感觉 720 只是分辨率,和清晰度没关系。所以和压缩质量有关吧?
    dong3580
        32
    dong3580  
       2016-01-04 12:40:20 +08:00
    微软不是开发过一个 apple 版本的照相应用么,不知道现在有没有那种硬件,
    AdamMaggie
        33
    AdamMaggie  
       2016-01-04 13:09:44 +08:00
    用 Adobe Premiere Pro+Adobe Media Encoder
    mhycy
        34
    mhycy  
       2016-01-04 13:31:41 +08:00
    @est
    时间换质量。。。
    和时间换空间一个道理

    看你的参数貌似没有设定码率。。囧
    还是上 MEGUI 吧,方便,参数对照说明改改也能有不错的效果。
    不过 MBP13 估计时间会很长就是了
    est
        35
    est  
    OP
       2016-01-04 14:13:42 +08:00
    @mhycy 码率会有 2pass 貌似会更慢。我这里是恒定质量。 MEGUI 不错。谢谢推荐。
    skydiver
        36
    skydiver  
       2016-01-04 15:05:37 +08:00
    Mac 上还可以用 handbrake 吧
    est
        37
    est  
    OP
       2016-01-04 15:34:44 +08:00
    @skydiver 就用的这货。输出的文件还是很大。速度很慢。比我命令行的还慢。
    skydiver
        38
    skydiver  
       2016-01-04 15:48:27 +08:00
    @est 没办法,这个东西就是纯靠 CPU 的,当年做一个短片结果 30 分钟的短片渲染了 2 小时。。想要快,换个 CPU 强劲的台式机吧。。
    mhycy
        39
    mhycy  
       2016-01-04 16:37:29 +08:00
    @est 时间换空间,必须的。。。
    stanzgy
        40
    stanzgy  
       2016-01-04 17:23:13 +08:00
    @est 几年前用过 megui 压制视频,记得就是一个 x264 的 GUI 版本,方便调整各种参数,配合 avs 脚本对视频进行各种裁剪滤镜等操作挺方便的,用命令行敲命令都要累死人了。。设置码率记得 1-3pass 都可以, 2pass 是压制高清视频时平衡压制时间与视频质量的最常用设置。至于压制时间完全就是看 cpu ,没有什么可以取巧的地方。
    est
        41
    est  
    OP
       2016-01-04 18:11:18 +08:00
    @stanzgy 看来  megui  是个神器。
    stanzgy
        42
    stanzgy  
       2016-01-04 18:47:10 +08:00
    @est 说起来感觉你的 32fps 的压制速度已经不错了。记得以前用一台 amd phenom II 925 [email protected] 机器, 8M 左右码率、 2pass 、 avs 做简单的 trim 锐化处理来压制视频,经常只有个位数的 fps ,一部 2 小时左右的电影压制 1080p 经常要不关机跑 2 天左右。现在硬件进步了,应该时间能快很多,你这里行车记录仪采集的图像应该质量不会很高,不需要的视频片段都可以用 avs 脚本裁掉,码率设置比较低的话,速度应该能快很多。
    shyrock
        43
    shyrock  
       2016-01-04 20:46:18 +08:00
    记录仪原始视频帧率多少?你想弄成 60fps 估计需要重采样,当然又大又慢。。。
    est
        44
    est  
    OP
       2016-01-04 21:44:06 +08:00
    @KexyBiscuit 用了这货。进度跑打雷 84%报了个 Unknown error 就退出了。我勒个大艹!
    est
        45
    est  
    OP
       2016-01-04 21:45:39 +08:00
    @KexyBiscuit microsoft hyperlapse 有个最大的 bug 是只能利用单核。。 libx264 是双核 4 线程完全跑满的。
    JamesRuan
        46
    JamesRuan  
       2016-01-04 23:06:51 +08:00
    60fps 的,同样时间大小就是 25fps 的四倍, 5G 也就相对于一般的 1G 左右的视频。
    一个小时 x264 1G 还是 720p 的,画面已经不怎么清晰了。
    @est 我觉得你对于技术有些过于乐观了,我当年剪辑 DV 的时候,无损压缩 20G 15min 左右的片子最终道出成 480p 的 Release 版本约 300M ,已经是酷睿 2 的时代了,还用了 5 个多小时!
    est
        47
    est  
    OP
       2016-01-04 23:48:19 +08:00
    @JamesRuan 嗯。我已经意识到现在压制视频很慢了!

    综合了一下,感觉这个命令输出的视频质量足够而且体积很小

    ffmpeg -i 1080p.mp4 -r 48 -vf "setpts=0.125*PTS,scale=1280x720" -c:v libx264 -sws_flags lanczos -an -crf 24 -preset slow out.mp4

    压缩前: 50 分钟 30fps 的 1080p ,体积 4.45GB
    压缩后: 5 分钟 48fps 的 720p ,体积 132MB , 8 倍速播放。

    细节基本没丢失。

    当然,要体验压制过程个位数 fps ,加上 deshake 这个 filter 即可。
    vimutt
        48
    vimutt  
       2016-01-05 00:51:06 +08:00 via Android
    用 premiere 吧 分分钟搞定 h264 1080#720 均可 帧率 30 (这东西不是越大越好 要符合播放设备的标准 和实时渲染的动画不同) 具体的输出质量在 pr 内有可调参数 慢进快进效果也都非常简单 一小时的片子输出几百 Mb 也不成问题
    est
        49
    est  
    OP
       2016-01-05 09:01:22 +08:00
    @vimutt 分分钟搞定目前看来不太可能啊。除非黑科技。压片都很慢的。
    vimutt
        50
    vimutt  
       2016-01-05 10:26:17 +08:00 via Android
    @est 哈哈 说的夸张了点 我的意思是用 pr 的话这些需求都能解决 也不难 网上查查就能解决
    xuhaoyangx
        51
    xuhaoyangx  
       2016-01-05 13:59:56 +08:00
    @vimutt pr 的画质还是一般, pr 一般都是搭桥出来用 x264 或者其他的编码器输出

    @est preset 的级别就是保证画质好坏的比较主要的参数,可以考虑直接在 slow 后面 加-x264opts ref=5:bframes=5:me=umh:merange=24:aq-strength=0.8:qcomp=0.5:aq-mode=2 -psy-rd 0.3:0 这一段

    压动漫电影=。=,志强双路经常只有 0.5fps 的速度,你们这些算很快了
    est
        52
    est  
    OP
       2016-01-05 14:02:53 +08:00
    @xuhaoyangx 回去一定试试。谢谢。

    0.5fps 还能忍啊?我直接扔了。
    est
        53
    est  
    OP
       2016-01-05 14:51:17 +08:00
    找了个 PC , i7 4790 ,发现 fps 只有 22 。。。一样的 ffmpeg 参数。我心里平衡了!
    xuhaoyangx
        54
    xuhaoyangx  
       2016-01-05 14:52:10 +08:00
    @est 因为要做很多处理, 0.5fps 很正常,特别是动漫。
    est
        55
    est  
    OP
       2016-01-05 22:28:54 +08:00
    @old9
    @loading
    @xuhaoyangx
    @congeec
    @mhycy

    特大喜讯, ffmpeg git 版本支持新的 concatdec_select 这个 vf ,一次性全搞定了。不用临时文件

    先建立个 list.txt 例如

    file 'input1.mp4'
    outpoint 300
    file 'input2.mp4'
    outpoint 300
    file 'input3.mp4'
    outpoint 300
    ...
    file 'inputn.mp4'
    outpoint 300

    然后:

    ffmpeg -f concat -i "list.txt" -r 48 -vf "select=concatdec_select,scale=1280x720,setsar=1,setpts=0.125*PTS" -sws_flags lanczos -c:v libx264 -crf 23 -an "merged-720p.mp4"


    http://superuser.com/a/1020455/15252

    我实验了,效果很好。
    congeec
        56
    congeec  
       2016-01-05 22:58:11 +08:00
    @est 呀,谢谢提醒,我都忘了。还有个 gifify 脚本很好用,里面也用到了这些东西。参考一下写个脚本也不错
    https://github.com/jclem/gifify/
    xuhaoyangx
        57
    xuhaoyangx  
       2016-01-05 23:16:48 +08:00
    @est megui 只是个 gui ,也是调用类似 ffmpeg X264 这些命令行的工具
    xuhaoyangx
        58
    xuhaoyangx  
       2016-01-05 23:17:56 +08:00
    @est 外国友人的回答真详细
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   6028 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 91ms · UTC 02:46 · PVG 10:46 · LAX 18:46 · JFK 21:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.