在XLearning中添加ffmpeg压缩视频的运行示例

类似于caffe,tensorflow等深度学习框架的集成,在XLearning中增加了基于Hadoop Yarn上的FFmpeg的调度。

1. 安装ffmpeg

install-ffmpeg.sh脚本代码:

#安装EPEL Release,因为安装需要使用其他的repo源,所以需要EPEL支持
yum install -y epel-release 
#导入一个Code
sudo rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro 
#安装nux-dextop源
sudo rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-1.el7.nux.noarch.rpm
#查看repo源是否安装成功
yum repolist 
#yum安装ffmpeg
yum install -y ffmpeg
#安装完成后检查ffmpeg 版本
ffmpeg -version

这里写图片描述

2.ffmpeg转压视频命令

ffmpeg -i H00C1T20171120230303C77.sdv -vcodec libx264 -preset fast -crf 20 -y -vf "scale=1920:-1" -acodec libmp3lame -ab 128k b.mp4

参数简单解释如下:
-vcodec: libx264 强制指定视频编码模式,使用codec编解码
-preset:指定编码的配置。x264提供了一些预设值,而这些预设值可以通过preset指定。这些预设值包括:ultrafast,superfast,veryfast,faster,fast,medium,slow,slower,veryslow和placebo。ultrafast编码速度最快,但压缩率低,生成的文件更大,placebo则正好相反。x264所取的默认值为medium。需要说明的是,preset主要是影响编码的速度,并不会很大的影响编码出来的结果的质量。压缩高清电影时,一般用slow或者slower,当你的机器性能很好时也可以使用veryslow,不过一般并不会带来很大的好处。
-crf:这是最重要的一个选项,用于指定输出视频的质量,取值范围是0-51,默认值为23,数字越小输出视频的质量越高。这个选项会直接影响到输出视频的码率。
-vf :video filters 设置视频过滤器
-acodec:audio codec,强制指定音频处理模式,使用codec编解码
-ab :audio bitrate 设置音频码率 64k/128k
-y:覆盖输出文件

3.运行脚本

run.sh脚本代码:

#/bin/sh
$XLEARNING_HOME/bin/xl-submit \
   --app-type "ffmpeg" \
   --app-name "ffmpeg_demo" \
   --input /tmp/data/ffmpeg#data \
   --output /tmp/ffmpeg_output#video \
   --files demo.sh,ffmpeg.py \
   --launch-cmd "sh demo.sh" \
   --worker-memory 2G \
   --worker-cores 2 \
   --queue default \

demo.sh脚本代码:
用于传递ffmpeg命令参数

python ffmpeg.py -i ./data/H00C1T20171120230303C77.sdv -preset fast -crf 20 -ab 128k -y ./video/b.mp4

ffmpeg.py代码:

import argparse
import sys
import os
import json
import subprocess

sys.path.append(os.getcwd())

FLAGS = None

def test():
    print("start test!")
    input_file = FLAGS.i
    video_codec = FLAGS.vcodec
    pre_set = FLAGS.preset
    crf = FLAGS.crf
    video_filters = FLAGS.vf
    audio_codec = FLAGS.acodec
    audio_bitrate = FLAGS.ab
    output_file = FLAGS.y
    print("test finished!")

if __name__ == "__main__":
  parser = argparse.ArgumentParser()
  parser.register("type", "bool", lambda v: v.lower() == "true")
  # Flags for defining the tf.train.ClusterSpec
  parser.add_argument(
    "-i",
    type=str,
    default="",
    help="input of video file"
  )

  parser.add_argument(
      "-vcodec",
      type=str,
      default="libx264",
      help="Coercive use of video codec codec"
  )

  parser.add_argument(
      "-preset",
      type=str,
      default="medium",
      help="Coded configuration,included ultrafast,superfast,veryfast,faster,fast,medium,slow,slower,veryslow and placebo"
  )

  parser.add_argument(
      "-crf",
      type=int,
      default=23,
      help="Quality of output video,the range of value is 0-51"
  )

  parser.add_argument(
      "-vf",
      type=str,
      default="scale=1920:-1",
      help="set video filters  "
  )

  parser.add_argument(
      "-acodec",
      type=str,
      default="libmp3lame",
      help="use of audio codec codec"
  )

  parser.add_argument(
      "-ab",
      type=str,
      default="",
      help="Setting the audio bitrate"
  )

  parser.add_argument(
      "-y",
      type=str,
      default="",
      help="Overlay output file"
  )

  FLAGS, unparsed = parser.parse_known_args()
  test()

4. 运行结果

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

更多精彩原创文章,详见红象云腾社区

猜你喜欢

转载自blog.csdn.net/redoop123/article/details/79740580