zoukankan      html  css  js  c++  java
  • 33.APP后端处理视频的方案

             在当前的app应用中,到处都能看到视频的身影,例如,在社交类的app上,用户可以拍摄属于自己的小视频,并发布到相应得栏目,增加和好友们互动的机会。

             后台常见的视频处理有以下几种:

    ·          视频的截图,很多视频列表上显示的一张图片,这张图片就是通过截取视频的某一帧(通常是第一帧)得到的。

    ·          视频加水印,出于版权保护的目的,需要添加水印。

    ·          视频转码,允许用户上传手机上的视频,并转换为app后端支持的格式。

    视频的处理对于大多数程序员来说是个很陌生的领域, 这里介绍一个视频处理最常用的工具:ffmpeg。

    (1)ffmpeg简介

             Ffmpeg的官网(http://ffmpeg.org/)是这样介绍的:Acomplete, cross-platform solution to record, convert and stream audio and video。一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。

             Ffmpeg是个跨平台的软件,可以在linux下使用,也可以在window,mac下使用。

             这个项目最早由FabriceBellard发起,现在由Michael Niedermayer维护。许多FFmpeg的开发人员都来自MPlayer项目,而且当前FFmpeg也是放在MPlayer项目组的服务器上。项目的名称来自MPEG视频编码标准,前面的"FF"代表"Fast Forward"。

             著名的播放器KMPlayer, 暴风影音,qq影音,都曾经使用过ffmpeg的代码。国内的七牛云存储,音视频处理的核心模块也是ffmpeg。

             Ffmpeg可以实现的功能有:

    l  视频采集

    l  音视频格式转换

    l  视频抓图

    l  给视频加水印

    FFmpeg主要由一下几个部分组成:

    libavcodec:包含了所有FFmpeg音视频编解码器的库。 为了保证最优性能和高可复用性,大多数编解码器从头开发的。

    libavformat:包含了所有的普通音视格式的解析器和 产生器的库。

    三个实例程序:

    ffmpeg:命令行的视频格式转换程序(一般就直接调用这个文件)

    ffplay:视频播放程序。(需要SDL支持)

    ffserver:多媒体服务器

    (2)程序调用ffmpeg的功能

             使用ffmpeg的进行视频转换很简单,例如,把avi转换为MP4,使用命令行:

    ffmpeg -i source.avi -f psp -r 29.97-b 768k -ar 24000 -ab

    64k -s 320×240 destination.mp4

             那么,在后台语言中,应该怎么调用ffmpeg进行格式转换呢?

             一个常见的思路,就用通过构造命令行的方式,把上面命令行构造出来,然后在后台语言中调用ffmpeg执行文件。

             有个java调用ffmpeg开源项目 jave (主页:http://www.sauronsoftware.it/projects/jave/)就是这样实现的。

             例如,下面的例子是avi转换成flv:

    File source = newFile("source.avi");
    File target = newFile("target.flv");
    AudioAttributes audio = newAudioAttributes();
    audio.setCodec("libmp3lame");
    audio.setBitRate(newInteger(64000));
    audio.setChannels(new Integer(1));
    audio.setSamplingRate(newInteger(22050));
    VideoAttributes video = newVideoAttributes();
    video.setCodec("flv");
    video.setBitRate(newInteger(160000));
    video.setFrameRate(new Integer(15));
    video.setSize(new VideoSize(400,300));
    EncodingAttributes attrs = newEncodingAttributes();
    attrs.setFormat("flv");
    attrs.setAudioAttributes(audio);
    attrs.setVideoAttributes(video);
    Encoder encoder = new Encoder();
    encoder.encode(source,target, attrs);


             通过类AudioAttributes和VideoAttributes设置了相关的参数,在类Encoder中把这些参数构造成命令行执行FFmpeg相关的命令。

             注意了,视频音频相关的操作一般都是非常耗费CPU资源,例如上面的例子,在avi转换成flv的过程中,系统的相关资源状况如下:

             从上图可看出,ffmpeg就占用了CPU差不多90%的资源。

             后端要快速地处理视频,需要高性能的服务器集群,但是,对于创业型公司来说,这点支出是非常不合算的。因此,可充分运用云服务,例如,七牛提供的服务就包含音视频格式的转换,调用非常方便。

    -------------------------------------------------------------------------------------------------

    打开链接  app后端系列文章总目录 总目录 ,能查看本人发表过的所有原创“app后端”文章。

    【作者】曾健生
    【QQ】190678908
    【app后端qq群】254659220 
    【微信公众号】 appbackend
    【新浪微博】 @newjueqi
    【博客】http://blog.csdn.net/newjueqi 


    如果您觉得文章对你有所帮助,欢迎打赏。


    微信打赏:



    支付宝打赏:

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    谁记录了mysql error log中的超长信息(记pt-stalk一个bug的定位过程)
    谈谈MySQL无法连接的原因和分析方法
    MySQL 5.7基于GTID复制的常见问题和修复步骤(二)
    日常运维故障记录和解决
    python学习之-- 故障记录汇总
    sshpass-Linux命令之非交互SSH密码验证
    python 之 线程池实现并发
    python 之 实现su 到root账号
    shell
    shell
  • 原文地址:https://www.cnblogs.com/dingxiaoyue/p/4926720.html
Copyright © 2011-2022 走看看