在当前的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:

  1. File source = newFile("source.avi");
  2. File target = newFile("target.flv");
  3. AudioAttributes audio = newAudioAttributes();
  4. audio.setCodec("libmp3lame");
  5. audio.setBitRate(newInteger(64000));
  6. audio.setChannels(new Integer(1));
  7. audio.setSamplingRate(newInteger(22050));
  8. VideoAttributes video = newVideoAttributes();
  9. video.setCodec("flv");
  10. video.setBitRate(newInteger(160000));
  11. video.setFrameRate(new Integer(15));
  12. video.setSize(new VideoSize(400,300));
  13. EncodingAttributes attrs = newEncodingAttributes();
  14. attrs.setFormat("flv");
  15. attrs.setAudioAttributes(audio);
  16. attrs.setVideoAttributes(video);
  17. Encoder encoder = new Encoder();
  18. encoder.encode(source,target, attrs);

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

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

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

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

APP后端处理视频的方案的更多相关文章

  1. 33.APP后端处理视频的方案

    在当前的app应用中,到处都能看到视频的身影,例如,在社交类的app上,用户可以拍摄属于自己的小视频,并发布到相应得栏目,增加和好友们互动的机会. 后台常见的视频处理有以下几种: ·          ...

  2. app后端设计--总目录 (转)

    特此说明,我转载的!!! app后端设计(1)--api app后端设计(2)--xmpp的使用 app后端设计(3)--短信,邮件,推送服务 app后端设计(4)-- 通讯的安全性 app后端设计( ...

  3. app后端设计--总目录

    做了3年app相关的系统架构,api设计,先后在3个创业公司中工作,经历过手机网页端,android客户端,iphone客户端,现就职于app云后端平台bmob(想了解bmob点击这里).其中的乐与苦 ...

  4. [置顶] app后端设计--总目录

    版权声明:本文为博主原创文章,未经博主允许不得转载. 做了3年app相关的系统架构,api设计,先后在3个创业公司中工作,经历过手机网页端,Android客户端,iphone客户端,现就职于app云后 ...

  5. 15.app后端怎么设计用户登录方案

    在很多app中,都需要用户的登录操作.登录,就需要用到用户名和密码.为了安全起见,暴露明文密码的次数越少越好.怎么能最大程度避免泄露用户的密码呢?在登录后,app后端怎么去验证和维持用户的登录状态呢? ...

  6. **15.app后端怎么设计用户登录方案(API权限安全)

    在很多app中,都需要用户的登录操作.登录,就需要用到用户名和密码.为了安全起见,暴露明文密码的次数越少越好.怎么能最大程度避免泄露用户的密码呢?在登录后,app后端怎么去验证和维持用户的登录状态呢? ...

  7. PHP开发 高可用 高安全App后端(免费)

    PHP开发高可用高安全App后端 第1章 本章先讲解课程所含技术点,并演示相关的项目,让小伙伴对课程有个初步的认知,然后再带领小伙伴进行功能的分析,表的ER总关系图 第2章 本章主要讲解课程的一些准备 ...

  8. PHP开发高可用高安全App后端☆

    第1章 本章先讲解课程所含技术点,并演示相关的项目,让小伙伴对课程有个初步的认知,然后再带领小伙伴进行功能的分析,表的ER总关系图 第2章本章主要讲解课程的一些准备工作知识.包括工具.环境.模板等. ...

  9. app 后端技术

    app 后端技术 一直以来工作的方向是web server,对app server没有什么了解.虽然没有接触过移动app开发,但对app后端技术还是挺有探索欲望的,app应用和web应用在前端的用户习 ...

随机推荐

  1. Android利用Socket与硬件通信之智能家居APP

    前几天做一个智能家居APP,硬件段使用的是ESP8266WIFI模块,其实不管是WIFI模块还是蓝牙,通信都是同样一个道理,获取IP和端口来进行通信. 我是通过XCOM v2.0 发送信息,移动端接收 ...

  2. 使用Jenkins进行android项目的自动构建(6)

    之前已经介绍过使用Maven做构建,在来介绍一下Gralde的自动化构建. 什么是Gralde?官方的解释是 Gradle is an open source build automation sys ...

  3. Hessian矩阵与牛顿法

    Hessian矩阵与牛顿法 牛顿法 主要有两方面的应用: 1. 求方程的根: 2. 求解最优化方法: 一. 为什么要用牛顿法求方程的根? 问题很多,牛顿法 是什么?目前还没有讲清楚,没关系,先直观理解 ...

  4. echart-柱状图

    目前在改别人遗留的bug,需求: 宽度 自适应的情况下 展示不友好:宽度太大 上下不居中 需求 要 上下 无论是否 有内容 都要居中展示 以0刻度为标准 宽度 设置 series: [ { name: ...

  5. Maven实战读书笔记(二):Maven坐标与仓库

    2.1 Maven坐标 Maven坐标是Maven用来表示一个组件依赖的标示. Maven通过下面几个元素定义坐标:groupId.artifactId.version.packaging.class ...

  6. 洛谷——P4932 浏览器

    P4932 浏览器 __stdcall给了你n个点,第i个点有权值x[i],对于两个点u和v,如果x[u] xor x[v]的结果在二进制表示下有奇数个1,那么在u和v之间连接一个Edge,现在__s ...

  7. Oracle数据库日常SQL的使用

    DDL 语句(数据定义语言Create.Alter. Drop.Truncate) 1.建表:create table 表名(): 2.复制表结构及其数据:create table 新表名 as se ...

  8. IDEA ctrl+alt+L 格式化快捷键无效时解决

    这几天发现自己Intellij IDEA ctrl+alt+L格式化代码无效 设置里面按照快捷键搜索 按了 ctrl+alt+L 也没反应 但是我设置的确实是默认的 ctrl+alt+L 最后终于找到 ...

  9. php中session和cookie的使用及区别

    1.cookie的使用 什么是 Cookie? cookie 常用于识别用户.cookie 是服务器留在用户计算机中的小文件.每当相同的计算机通过浏览器请求页面时,它同时会发送 cookie.通过 P ...

  10. 【练习】reserving.kr 之imageprc write up

    补充:c++ builder 与 windows  API经典范例 #include <vcl.h> #pragma hdrstop #include "Unit1.h" ...