首页 > 如何对VOD内容文件进行转码?

如何对VOD内容文件进行转码?

网络收集 2020-10-01 23:01:20
Flussonic Media Server 推荐使用ffmpeg对VOD文件进行转码。

注意: 在不同的操作系统下,ffmpeg有不同的安装方式。

一、在Windows下安装ffmpeg和相关Codec

1、首先从http://ffmpeg.zeranoe.com/builds/下载软件,并解压缩它。例如将其解压缩到C:\ffmpeg下。 然后将C:\ffmpeg和c:\ffmpeg\bin加入系统的环境变量path中。

2、打开Dos命令行窗口,进入c:\ffmpeg\bin路径下,准备开始使用ffmpeg

3、安装K-Lite Mega Codec 软件安装包,下载地址http://www.codecguide.com/download_k-lite_codec_pack_mega.htm.

注意:在安装时,请选择fullest complete installation

二、在Linux下安装ffmpeg和相关Codec

我们推荐从http://johnvansickle.com/ffmpeg 或 ffmpeg官网下载已经编译好的二进制版本。

我们不建议你使用你的Linux发行版本自带的ffmpeg,因为它的版本可能会非常老了。我们建议你使用较新的版本。

关于相关Codec安装包,请根据ffmpeg的提示来安装缺少的Codec。

三、使用ffmpeg

首先,假设有一个名为h.m4v的vod文件,它包含1路视频,2路音频(英语和俄语),以及2路字幕(英文和俄文),请使用以下命名来检查这个文件中包含的音视频信息:

ffmpeg -i h.m4v

运行上述命令行,您将会得到如下响应:

Stream #0:0(eng): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p, 640x360 [SAR 1331:1000 DAR 2662:1125], 1800 kb/s, 23.98 fps, 23.98 tbr, 25k tbn, 180k tbc Metadata: creation_time : 2013-01-14 14:46:26 handler_name : Stream #0:1(rus): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, s16, 127 kb/s Metadata: creation_time : 2013-01-14 14:47:59 handler_name : Stream #0:2(eng): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, s16, 127 kb/s Metadata: creation_time : 2013-01-14 14:48:19 handler_name : Stream #0:3(rus): Subtitle: mov_text (tx3g / 0x67337874) Metadata: creation_time : 2013-01-14 14:48:38 handler_name : Stream #0:4(eng): Subtitle: mov_text (tx3g / 0x67337874) Metadata: creation_time : 2013-01-14 14:48:38 handler_name : 根据上面的信息,你会看到每1个stream都有一个编号(0:0,0:1,0:2,0:3,0:4)、stream type(视频或音频或字幕)以及语言(例如英语或俄语)。

转码后的VOD文件有着和上面同样的结构,只是有更多的视频轨道(track)。举个例子,假设我们需要在视频文件中包含3个不同质量的视频轨道。如下:

总计: 3路视频 + 2路音频 + 2路字幕 = 7路(轨道Track)

下面我们介绍具体的转码命令,首先来看第一行:

ffmpeg -i "/home/olegchir/temp/h.m4v" \ 注意,在Linux系统下,\是命令中的换行符。如果是在Windows环境下,请用^号替代,如下: ffmpeg -i "/home/olegchir/temp/h.m4v" ^ 这一行的命令的意思是要转码的源文件的地址是/home/olegchir/temp/h.m4v,这个地址是用-i参数来指定。

接下来,我们需要将0:0代表的视频转出3份不同质量的流,对应的命令是-map 0:0 -map 0:0 -map 0:0,也就是将0:0的流拷贝了3份,然后,其它部分的轨道(track)按顺序依次排列(0:1, 0:2, 0:3, 0:4),对应的命令是在这个命令行添加 -map 0:1 -map 0:2 -map 0:3 -map 0:4即可。

由此,这个命令的前两行应该看起来如下所示:

ffmpeg -i "/home/olegchir/temp/h.m4v" \ -map 0:0 -map 0:0 -map 0:0 -map 0:1 -map 0:2 -map 0:3 -map 0:4 \ 重要提示,在转出的视频轨道中,v:0代表第一路视频,v:1代表第二路视频,a:0代表第一路音频,a:1代表第二路音频,以此类推。

-c:v:0 copy -metadata:s:v:0 language=eng \ 表示第一路视频的编码直接从原始文件中拷贝,语言为英文。

-c:v:1 libx264 -b:v:1 150k -metadata:s:v:1 language=eng \ 表示第二路视频的编码器为x264,码率为150k,语言为英文。

-c:v:2 libx264 -b:v:2 100k -metadata:s:v:2 language=eng \ 这是第三路视频,和前面的一样,只是码率为100k.

copy 表示编码是从原始流中拷贝来的,不做任何修改。例如,我们对音频不做任何修改,只是拷贝,命令如下:

-c:a:0 copy -metadata:s:a:0 language=rus \

-c:a:1 copy -metadata:s:a:1 language=eng \

-c:s:0 copy -metadata:s:s:0 language=rus \

-c:s:1 copy -metadata:s:s:1 language=eng \

结合前面的命令,此时,你的ffmpeg命令看起来如下:

ffmpeg -i "/home/olegchir/temp/h.m4v" \ -map 0:0 -map 0:0 -map 0:0 -map 0:1 -map 0:2 -map 0:3 -map 0:4 \ -c:v:0 copy -metadata:s:v:0 language=eng \ -c:v:1 libx264 -b:v:1 150k -metadata:s:v:1 language=eng \ -c:v:2 libx264 -b:v:2 100k -metadata:s:v:2 language=eng \ -c:a:0 copy -metadata:s:a:0 language=rus \ -c:a:1 copy -metadata:s:a:1 language=eng \ -c:s:0 copy -metadata:s:s:0 language=rus \ -c:s:1 copy -metadata:s:s:1 language=eng \ 接下来,让我们设置音频和视频同步指令,然后指定输出的文件路径,如下:

-async 1 -vsync 1 \ "/home/olegchir/temp/h2.m4v" 综上,所有这些命令合起来,就是下面这样: ffmpeg -i "/home/olegchir/temp/h.m4v" \ -map 0:0 -map 0:0 -map 0:0 -map 0:1 -map 0:2 -map 0:3 -map 0:4 \ -c:v:0 copy -metadata:s:v:0 language=eng \ -c:v:1 libx264 -b:v:1 150k -metadata:s:v:1 language=eng \ -c:v:2 libx264 -b:v:2 100k -metadata:s:v:2 language=eng \ -c:a:0 copy -metadata:s:a:0 language=rus \ -c:a:1 copy -metadata:s:a:1 language=eng \ -c:s:0 copy -metadata:s:s:0 language=rus \ -c:s:1 copy -metadata:s:s:1 language=eng \ -async 1 -vsync 1 \ "/home/olegchir/temp/h2.m4v" 有时候,我们只需要提取原始VOD文件的一部分,对其进行转码并输出。那么,接下来,我们介绍如何提取原始文件中的一部分进行转码并输出。

这时,你可以使用 -ss 和 -t 命令,其中-ss表示开始时间,-t表示时长。

ffmpeg -i "/home/olegchir/temp/h.m4v" \ -ss 00:00:00 -t 00:05:00 \ -map 0:0 -map 0:0 -map 0:0 -map 0:1 -map 0:2 -map 0:3 -map 0:4 \ -c:v:0 copy -metadata:s:v:0 language=eng \ -c:v:1 libx264 -b:v:1 150k -metadata:s:v:1 language=eng \ -c:v:2 libx264 -b:v:2 100k -metadata:s:v:2 language=eng \ -c:a:0 copy -metadata:s:a:0 language=rus \ -c:a:1 copy -metadata:s:a:1 language=eng \ -c:s:0 copy -metadata:s:s:0 language=rus \ -c:s:1 copy -metadata:s:s:1 language=eng \ -async 1 -vsync 1 \ "/home/olegchir/temp/h2.m4v" 在上面的例子中,-ss 00:00:00 -t 00:05:00 ,表示从0分0秒开始,提取5分钟的时长。

接下来,我们来看看如何在转码时设置视频的分辨率:

有时候,我们需要在转码时设置视频的分辨率,可以采用-filter指令和scale指令对对应的视频设置分辨率,命令如下:

-filter:v:3 scale=320:240 其中,v:3代表第四路视频,scale=320:240表示分辨率的宽为320,高为240。另外,如果你确认宽为320,高按比例缩放,那么分辨率也可以设置为320:-1。

我们最后来看这个完整的命令,如下:

ffmpeg -i "/home/olegchir/temp/h.m4v" \ -ss 00:00:00 -t 00:05:00 \ -map 0:0 -map 0:0 -map 0:0 -map 0:0 -map 0:1 -map 0:2 -map 0:3 -map 0:4 \ -c:v:0 copy -metadata:s:v:0 language=eng \ -c:v:1 libx264 -b:v:1 150k -metadata:s:v:1 language=eng \ -c:v:2 libx264 -b:v:2 100k -metadata:s:v:2 language=eng \ -c:v:3 libx264 -b:v:3 100k -metadata:s:v:3 language=eng -filter:v:3 scale=320:-1 \ -c:a:0 copy -metadata:s:a:0 language=rus \ -c:a:1 copy -metadata:s:a:1 language=eng \ -c:s:0 copy -metadata:s:s:0 language=rus \ -c:s:1 copy -metadata:s:s:1 language=eng \ -async 1 -vsync 1 \ "/home/olegchir/temp/h2.m4v"
免责声明:非本网注明原创的信息,皆为程序自动获取互联网,目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责;如此页面有侵犯到您的权益,请给站长发送邮件,并提供相关证明(版权证明、身份证正反面、侵权链接),站长将在收到邮件12小时内删除。

一周热门

查看更多