Fork me on GitHub
0%

Mplayer编译及使用说明

简介

官网:http://www.mplayerhq.hu/design7/news.html

MPlayer是一款开源的多媒体播放器,以GNU通用公共许可证发布。此款软件可在各主流操作系统使用,例如Linux和其他类Unix操作系统、微软Windows系统及苹果电脑的Mac OS 系统。MPlayer是建基于命令行界面,在各操作系统可选择安装不同的图形界面。

ubuntu下编译过程

  1. 下载并解压源码文件click here

  2. 生成配置文件(目前直接走默认参数选项)

    1
    2
    # 直接执行./configure错误,--yasm=''参数是根据提示没有找到yasm,可通过该命令直接执行
    ./configure --yasm=''
  3. 编译

    1
    2
    make
    # make完成既可看到文件夹下存在mplayer可执行文件
  4. 安装

1
2
# 将mplayer及依赖的库文件进行安装, 不安装也可以进行使用
sudo make install

源码文件

  • vd__*

    video decode 与解码相关的,解码器只是负责把解码完成的帧传输给vo,如何显示是vo的函数实现;

  • vf__*

    video filter 所有过滤器的定义,当命令行输入-vf的参数,规则会去相应的filter函数解析。例如: -vf rotate=2,vf_rotate.c的函数进行进行rotate函数的解析。

  • vo_*

    video output 输出的函数定义,每一个函数对应实现一种或几种的功能。例如:vo_md5sum.c得到md5的一个值

  • DOCS 文档

mplayer流程

  1. 调用 AddExcept()注册异常处理函数

  2. initmplayer(); //初始化,创建快进和暂停的信号量

  3. InitTimer();初始化计时器

  4. mp_msg_init();初始化消息系统

  5. set_path_env();设置路径、环境

  6. ipu_image_start();ipu初始化

  7. mplayer_showmode(1);设置显示模式

  8. parse_codec_cfg(NULL);解析codec配置寄存器

  9. 打开数据流

  10. 分析播放树

  11. 添加播放树列表

  12. 初始化预填充缓存

  13. 打开播放的文件

  14. 创建buffer

  15. 打开数据流

  16. 检测数据流类型(音频格式和视频格式)

  17. 分析音频流视频流的信息(原始视频尺寸、分辨率、帧频率、码流大小)

  18. 启动相应的分离器

  19. 分析剪辑信息

  20. 初始化codec(多媒体数字信号编解码器)

  21. 选择打开相应的视频解码器

  22. 初始化视频解码器,分析视频流信息

  23. 选择打开相应的音频解码器

  24. 初始化音频解码器、PCM,分析音频信息

  25. 同步音频视频输出

  26. 开始播放

命令行参数

  • -list-options 打 印 所有 可 用 的 选 项

  • -vf 选择视频相关参数

    • format 选择解码之后的格式输出

      • NV12 / NV21
      • BGRA
      • RGB
    • rotate 选择旋转的角度输出

      • 1 顺时针旋转90
      • 2 顺时针旋转270
      • 4 旋转0度
  • -slave 从模式,mplayer会从标准输入读一个换行符(/n)分隔开的命令。

  • -quiet 去除杂项信息, 使 控制屏幕输出简略;尤其是阻止显示状态行(即 A: 0.7 V: 0.6 A-V: 0.068 …)

  • -speed <0.01 - 100>选择播放速率

  • -vo 指定视频输出驱动的优先级列表

  • -vc 选择编解码器, -vc help 可以列出所有视频解码器,其中中括号里面是.dll的是我们无法使用的

    • ffm264 264软解码
    • ffh264v4l2m2m 264硬解码
  • -ao 指定音频输出驱动的优先级列表

  • -ac 指定音频解码器优先级列表

  • -zoom -x 800 -y 400 指令播放窗体的大小

  • -input 输入

    • cmdlist 列出所有可绑定按键的命令
    • file 命令输入通道。制定输入fifo的名字,写入控制命令,与slave参数一起使用

slave模式

说明

MPlayer为后台运行其他程序,不再截获键盘事件,MPlayer会从标准输入读一个换行符(/n)分隔开的命令。

大多数slave模式命令相当于命令行选项。

  • 命令行播放通过 -input file= 参数监听某个管道

  • 另起一个线程,创建同名管道并输入6.2所示控制参数即可达到控制mplayer的效果

    1
    2
    $ mkfifo /tmp/fifofile
    $ mplayer -slave -input file=/tmp/fifofile <movie>

具体使用说明可以参考源文件下DOCS/tech/slave.txt

控制参数

mplayer -input cmdlist 命令可以打印出一份可以输入清单

  • get_file_name 打印当前文件名
  • get_percent_pos 打印出文件中的当前位置为整数百分比(0-100)
  • get_time_length 打印当前文件长度用秒表示
  • get_time_pos 打印文件当前位置用秒表示
  • seek 定位电影的某些地方
    • 0 是一个相对定位+/- (默认值)
    • 1 是定位%在电影里
    • 2 是寻求一个绝对位置的秒。
  • quit 推出mplayer进程
  • stop 停止播放
  • exit 从OSD菜单退出控制台。不像’quit’,不退出MPlayer的

demo

针对slave使用方法,简单写了几个函数作为参考示例

github仓库(mplayerInterface文件夹):click here

Q&A

  1. MPlayer interrupted by signal 13 in module: key_events ?

    因为Mplayer是通过换行符(“\n”)来分隔不同的命令,所以我们在编程中不管是写入到管道文件还是写入到QT的进程中在命令后面一定要加入换行符(“\n”),这样Mplayer才能辨别。

  2. 只有在串口有输出,adb shell没有输出

    错误信息:Cannot find HOME directory.

    解决方法:setenv(“HOME”,“/”,“1”)

  3. 在vo部分添加 rotate功能 之后, 只有一个方向可以正常显示?

对于nv12格式的图片和数据, uv_stride和stride这两个参数影响LCD最终显示的效果. 在旋转之后需要将对应的宽高对应到相应的stride中, 最终可以正常显示

  1. mpi被mplayer用来存储解码之后的图像(mp_image.h中定义),得到mpi之后,vf被调用,整个filter链上钉filter都被调用了一遍包括最后的vo; 在vo的put_image里把图像输出到显示器上。这个时候需要考虑图像的存储方法,即用哪种颜色空间。

  2. https://blog.csdn.net/willand1981/article/details/5783107

参考文章