jz2440 ARM9 开发板移植 mplayer

被刻印的时光 ゝ 提交于 2020-02-17 20:01:52

1 、所需工具

mplayer版本 MPlayer-1.0rc2.tar.bz2 (我试了最新版本 一直出错 便还是选择了这个版本)
libmad版本 libmad-0.15.1b.tar.gz
(libmad)是一个开源的高精度 MPEG 音频解码库,完全是定点计算,非常适合没有浮点支持的平台上使用。

2、编译libmad

先解压libmad
tar xf libmad-0.15.1b.tar.gz
cd libmad-0.15.1b
./configure --prefix=/work/mplayer/mplayer --enable-fpm=arm --host=arm-linux --disable-debugging --enable-shared --enable-static CC=arm-linux-gcc //生成配置文件
–prefix=/work/mplayer/mplayer //是生成 mad.h 和 libmad 库的地方 自定义即可
make && make install

3、编译mplayer

解压再进入解压后的目录

./configure --prefix=/work/mplayer/mplayer --cc=arm-linux-gcc --target=arm-linux --enable-static --disable-win32dll --disable-dvdread --disable-dvdread-internal --disable-dvdnav --disable-libdvdcss-internal --disable-mencoder --disable-mp3lib --disable-armv5te --disable-armv6 --enable-fbdev --enable-mad --enable-libavcodec_a --enable-libavcodec_mpegaudio_hp --disable-iconv --enable-linux-devfs --disable-ivtv --language=zh_CN --enable-cross-compile --enable-real --enable-ossaudio --host-cc=gcc --disable-live --with-extraincdir=/work/mplayer/mplayer/include --with-extralibdir=/work/mplayer/mplayer/lib 2>&1|tee logfile
//生成配置文件

–prefix=/work/mplayer/mplayer //生成可执行程序的路径,自定义即可
–with-extraincdir=/work/mplayer/mplayer/include --with-extralibdir=/work/mplayer/mplayer/lib //libmad 和 //mad.h 所在路径 根据自己情况写
–disable-win32dll //禁用win32动态连接库支持
–disable-mp3lib //这是一个浮点运算解码的 2440 上用不了 所以要禁止
–enable-mad //支持 libmad 解码

make && make install

这时候可能会有错误

在这里插入图片描述
如果是这种错误的话
vim libavcodec/armv4l/dsputil_arm_s.S
vim libmpeg2/motion_comp_arm_s.S
在这两个文件开头加上
#ifndef HAVE_PLD
.macro pld reg
.endm
#endif
然后我又遇见了这个错误
在这里插入图片描述
不知道是为什么 但是去掉 config.mak 33 行处的-s 参数之后 再次 make && make install 就没错误了
这时候会在目录下生成两个可执行文件 mplayer 和 mencoder
mencoder 是一个格式转换工具 比如我在小破站上直接下载的文件 在开发板上用 mplayer 上播放 就提示
在这里插入图片描述
就不支持 ,此时这个工具就可以派上用场了 可以用这个转换成 mp4 或者 avi 格式的 但是我看网上说可以直接用 但我的不可以 还是需要 sudo apt 一下
在这里插入图片描述
直接百度就出来的 就可以进行格式转换了
扯远了
在生成可执行文件 mplayer 后 将它复制到开发板的 bin 目录下面 就可以使用了

但会出现没有声音的情况

提示 [AO OSS] 音频设置: 无法打开音频设备 /dev/sound/dsp: No such file or directory
此时
mkdir -p /dev/sound
ln -s /dev/dsp /dev/sound/
或者把这个直接加在 rc.S 文件里 虽然我加了 开机后还是没有
但我这样弄了之后 不光没有声音 连动画画面也没有了
然后我测试了下 音频驱动 cat 1.mp3 > /dev/sound/dsp 差点儿给我震聋
嗯 音频驱动没有问题
而且我装了madplay 播放 MP3 文件完全可以播放

我查了一下 mplayer 使用指南

player -zoom -x <x> -y <y> <somefile>  //指定播放的尺寸
mplayer -fs <somefile> //全屏播放


mplayer -ac mad //用libmad播放
-framedrop //慢系统上播放

我又试了一次 mplayer -ac mad -framedrop -fs 01.avi

正在播放 01.mp4。
检测到 Quicktime/MOV 文件格式。
[mov] 找到音频流,-aid 0
[mov] 找到视频流,-vid 1
VIDEO:  [avc1]  544x960  24bpp  29.079 fps    0.0 kbps ( 0.0 kbyte/s)
==========================================================================
打开视频解码器: [ffmpeg] FFmpeg's libavcodec codec family
已选视频编解码器: [ffh264] vfm: ffmpeg (FFmpeg H.264)
==========================================================================
==========================================================================
打开音频解码器: [faad] AAC (MPEG2/4 Advanced Audio Coding)
AUDIO: 44100 Hz, 2 ch, s16le, 64.2 kbit/4.55% (ratio: 8026->17640s3c2410-uda1341-superlp: audio_set_dsp_speed:44100 prescaler:66
s3c2410-uda1341-superlp: audio_set_dsp_speed:44100 prescaler:66
0)
已选音频编解码器: [faad] afm: faad (FAAD AAC (MPEG-2/MPEG-4 Audio) decoder)
==========================================================================
AO: [oss] 44100Hz 2ch s16le (2 bytes per sample)
开始播放...
VDec: vo 配置请求 - 544 x 960 (色彩空间首选项: Planar YV12)
找不到匹配的色彩空间 - 重新尝试 -vf scale...
打开视频滤镜: [scale]
VDec: 使用 Planar YV12 作为输出 csp (没有 0)
电影宽高比未定义 - 没使用预放大。
[swscaler @ 0x80b184]No accelerated colorspace conversion found
[swscaler @ 0x80b184]SwScaler: using unscaled yuv420p -> bgr565 special converter
VO: [fbdev] 544x960 => 544x960 BGR 16-bit
A:   0.0 V:   0.0 A-V:  0.000 ct:  0.000   1/  1 ??% ??% ??,?% 0 0

会一直卡在这里不会播放动画 也没有声音 但我点了一下快进键 发现动画 可以快进后退
但还是会卡住
这便很显然 是声卡驱动有问题
我在网上找 发现了一位大神的解决办法 链接

在声卡驱动里 smdk2410_audio_open 函数里修改

if (cold) {
			audio_rate = AUDIO_RATE_DEFAULT;
			audio_channels = AUDIO_CHANNELS_DEFAULT;
			audio_fragsize = AUDIO_FRAGSIZE_DEFAULT;
			audio_nbfrags = AUDIO_NBFRAGS_DEFAULT;
			if ((file->f_mode & FMODE_WRITE)){
				init_s3c2410_iis_bus_tx();
				audio_clear_buf(&output_stream);
			}
			if (!output_stream .buffers && audio_setup_buf(&output_stream))
                  return -ENOMEM;
			
			if ((file->f_mode & FMODE_READ)){
				init_s3c2410_iis_bus_rx();
				audio_clear_buf(&input_stream);
			}
		}

这个问题产生的根源最终追溯到音频的驱动部分。现在大部分的嵌入式板子都使用菲利普 uda1341 音频芯片,因而也都使用了相同一个音频驱动,即 MIZI 公司拥有版权的 linux uda1341 音频驱动,这个驱动基本上符合了 oss 的规范,但是当使用到多段 DMA 音频数据传输时,出现了一个问题,即 DMA 缓冲的建立发生在第一次调用 write()函数将音频数据传送到设备描述符的时候,然而 oss 驱动的调用者通常要在打开音频设备描述时候,就期望获取 DMA 缓冲的信息,然而因为缓冲尚未建立,因而返回缓冲大小为 0 这个结果。

按以上的方法做了,但是还是出现同样的提示,仔细的看了驱动,在驱动上加了大量的调试信息最后发现在smdk2410_audio_ioctl 中调用的一个函数老是返回错误,这个函数是
access_ok(VERIFY_WRITE, inf, sizeof(*inf)),查了这个函数的代码发现返回1的时候是表示可以访问,而不是错误,所以导致下面代码老是出错,其实运行都是对的:
int err = access_ok(VERIFY_WRITE, inf, sizeof(*inf));
if (err)
return err;
于是改成 int err = !access_ok(VERIFY_WRITE, inf, sizeof(*inf));
重新编译内核,就可以了

但是 在我播放一次视频 准备再播放一次的时候 又出现了新的问题 (是不是有毒 所有能碰见的问题都给我遇见了呗 -_-!!!)
在这里插入图片描述

无法初始化视频驱动 !

我的运行的命令是 mplayer -ac mad -framedrop -fs
但我播放另外一个视频就可以
于是我去掉 -fs 命令 OK

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!