流媒体技术世界——分享技术,增值服务
如何对VOD内容文件进行转码?

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/ffmpegffmpeg官网下载已经编译好的二进制版本。

我们不建议你使用你的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"
	
匿名用户
评论

我们的地址


北京市朝阳区管庄西里建基商务楼423室


邮编:100024

关于我们


北京联方信科信息技术有限责任公司


官网:www.ttstream.com

联系我们


王经理:phone


柳经理:phone

京ICP备14033868号-2