TimothyQiu's Blog

keep it simple stupid

小试了一下 FFmpeg

分类:技术,闲扯

今天逛 Nico 的时候忽然起了搬运的念头,于是把原视频下载下来,开始进行传说中的「战渣浪」运动。在地图上到处逛搜集到如下信息:

发现不是很麻烦,懒得再去找某个版本的 MediaCoder,就直接上 FFmpeg 了……

查看文件信息

为了确定码率,首先用这样的方法查看文件信息:

ffmpeg -i <输入文件>

我从 Nico 下载视频的时候不是混杂时段,下载到的是高清 MP4 文件,于是 FFmpeg 就会输出类似这样的信息:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'filename.mp4': Metadata: Duration: 00:02:59.77, start: 0.000000, bitrate: 430 kb/s Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 854x480, 315 kb/s, 30 fps, 30 tbr, 30 tbn, 60 tbc Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, s16, 111 kb/s

可以看出一共有 1 个输入文件,其中包含 1 条视频流和 1 条音频流。各自的码率已经可以看得很清楚了,这里该文件的平均码率没有超过 500Kbps,于是安心地进行下一步。

将 MP4 封装为 FLV

因为下载下来的是 MP4 格式文件,需要将文件(容器)换为 FLV 才能够不被新浪二压:

ffmpeg -i <输入文件> -vcodec copy -acodec copy -f flv <输出文件>

FFmpeg 的 -vcodec-acodec 选项指定了输出文件的编码器,而填入 copy 则表示直接复制,不编码。

-f 选项是用来强制指定输出格式的,虽然 FFmpeg 自己会根据输出文件的扩展名猜,但还是写一下更保险。

其它未尽事宜

于是收工上传,不久发现直接成功了 = = 呃……我记得很久很久以前我用 MediaCoder 还失败了两次呢,囧。

这次很幸运的是下载到的文件码率没有超标,如果超标的话,据说这样可以指定码率:

ffmpeg -i input.mp4 -vcodec h264 -acodec aac -b:v <视频码率> -b:a <音频码率> output.mp4

至于传说中的 h264 2-pass 压制法(用来在更好的视频质量下控制码率),据说是这样的:

ffmpeg -i input.mp4 -pass 1 -vcodec h264 -an -b:v <视频码率> -f rawvideo -y NUL
ffmpeg -i input.mp4 -pass 2 -vcodec h264 -acodec aac -b:v <视频码率> -b:a <音频码率> output.mp4

这里的第一 Pass 因为目的只是取得一个包含视频信息的 log 文件,所以用 -an 禁用音频、用 NUL(或者 /dev/null)防止视频文件生成。

至于其它用法就留待以后要用上的时候再去研究了(懒……

以上。

FFmpeg

已有 8 条评论 »

  1. 有没有试过ffmpeg的视频滤镜功能呢。我试了下 效率很慢 你有什么好的优化方法吗

    1. 用过,感觉还可以。「效率很慢」要看你跟什么比了。

      1. 比如我对一个259K只有4秒的视频加黑白滤镜,都要花费十几秒的时间,滤镜你是怎么处理的呢

        1. 主要是 colorchannelmixer 滤镜……

          比如 ffmpeg -i input.mp4 -vf colorchannelmixer=.3:.4:.3:0:.3:.4:.3:0:.3:.4:.3 -vcodec libx264 -pix_fmt yuv420p output.mp4

          也是只有 4 秒 200K+ 640x360 的视频大概一两秒。

          1. 电脑的配置 比如CPU什么的

          2. 2.5GHz i5 / 4G Ram

  2. mich mich

    -b:v 设置了 500k , 但是转码出的视频文件的码率大于500k, 成了518K了, 导致文件变大了些。

    楼主遇到过没?

    1. 目前没有遇到过,感觉可能是 1K = 1000B / 1024B 导致的,可以尝试调低目标码率。

添加新评论 »