splfsp 发表于 2015-10-21 10:10:03

出3000元软妹币求助重新编译树莓派omxplayer,实现自己的功能

本帖最后由 splfsp 于 2015-10-21 10:13 编辑

咱们坛里高手多,在这里求助一个困扰了我好多天的问题,问题如下:
做了个小东西,用程序控制树莓派播放视频,视频文件存在U盘中,正常播放没有问题,但是在播放过程中,拔掉U盘的话,程序就死掉了。程序用python写的,调用omxplayer播放视频。
现在要实现拔掉U盘后,omxplayer能正常退出,不引起整个程序死机。有没有哪个高手能告知下怎么实现这个功能还是说要修改omxplayer代码。
希望有高手能提供解决办法或者是帮我编译下有此功能的omxplayer,omxplayer代码在https://github.com/popcornmix/omxplayer
我自己对linux不是很熟悉,
如果提供解决了,愿意出3000元软妹币聊表心意,穷人一个啊。

splfsp 发表于 2015-10-21 10:12:11

静静等待高手解救

dhbighead 发表于 2015-10-21 10:14:05

帮你搜索下看看。。

hzpyl 发表于 2015-10-21 10:18:28

诚意满满。

虽然我不懂,帮顶!

splfsp 发表于 2015-10-21 10:20:37

感谢大家帮顶,我是弄了好几天,实在没有解决,想到咱坛里高手多啊,所以来求助,钱只是用来表达下心意,毕竟高手也是要花时间的

splfsp 发表于 2015-10-21 10:23:48

钱少,高手不要看不上啊,静静等待

dhbighead 发表于 2015-10-21 10:24:52

splfsp 发表于 2015-10-21 10:23
钱少,高手不要看不上啊,静静等待

我编译一下试试看吧。。
不是高手。。看看能不能解决问题

splfsp 发表于 2015-10-21 10:31:05

dhbighead 发表于 2015-10-21 10:24
我编译一下试试看吧。。
不是高手。。看看能不能解决问题

谢谢,应该要改下小部分代码,就是要正在读取的文件消失的话,omxplayer程序退出

sblpp 发表于 2015-10-21 10:32:45

omxplayer不行的话,就移植mplayer呗,这么多播放器非得用它啊?

splfsp 发表于 2015-10-21 10:34:58

sblpp 发表于 2015-10-21 10:32
omxplayer不行的话,就移植mplayer呗,这么多播放器非得用它啊?

因为在树莓派上,只有这个播放器是硬解的,其它的自己移植实现硬解功能,对我难度更大啊

splfsp 发表于 2015-10-21 10:50:13

静静等待

splfsp 发表于 2015-10-21 11:04:41

顶一顶,不要下沉

菜包 发表于 2015-10-21 11:16:28

omxplayer在运行中强行kill掉之后再重新运行,能不能正常播放?如果能正常播放的话就可以试试下面的方法:
用udev消息加脚本行不行,U盘拔出后运行一个脚本,umount掉U盘,然后关闭omxplayer,可以向omxplayer线程发信号让它正常关闭,并等一段时间,若omxplayer仍在运行就强制kill掉,omxplayer结束运行之后向你的程序发个消息,你的程序再做其他处理

huangqi412 发表于 2015-10-21 11:29:58

都上操作系统了,跟电脑类似环境了。   播放软件代码太复杂,通过别的方式应该也可以吧。   比如开机运行一个小程序,检测U盘和播放软件。U盘被拔掉后对播放软件进行干预。

splfsp 发表于 2015-10-21 11:30:59

菜包 发表于 2015-10-21 11:16
omxplayer在运行中强行kill掉之后再重新运行,能不能正常播放?如果能正常播放的话就可以试试下面的方法:
...

强行kill后重新运行可以正常播放,我的程序里kill不行,因为有可能这时候程序已经死掉了,U盘拔出后运行一个脚本,umount掉U盘,强制kill掉omxplayer应该可以。

这种脚本可以有吗?就是U盘插上后就mount U盘,U盘拔掉时,umount掉U盘,强制kill掉omxplayer。不需要跟我程序通信。

但我对这个不熟悉,不会弄脚本,您能抽点时间帮我解决下吗?

splfsp 发表于 2015-10-21 11:35:46

huangqi412 发表于 2015-10-21 11:29
都上操作系统了,跟电脑类似环境了。   播放软件代码太复杂,通过别的方式应该也可以吧。   比如开机运行一 ...

这样也可以,但我不会啊,献血来不及啊,时间短,dabian里检测U盘拔出我都没有做好,现在是通过检测文件夹是否存在来弄的,但这样有弊端,拔出一会后文件夹才消失

dhbighead 发表于 2015-10-21 11:48:46

本帖最后由 dhbighead 于 2015-10-21 11:58 编辑

splfsp 发表于 2015-10-21 11:35
这样也可以,但我不会啊,献血来不及啊,时间短,dabian里检测U盘拔出我都没有做好,现在是通过检测文件 ...

能试试 插拔U盘前后 /dev/目录下文件的区别吗?

然后试试运行这个代码,直接复制,然后粘贴到命令行里面,点回车就行
这段代码的意思是,如果/dev/sda1不存在的话,就把所有的omxplayer杀掉。/dev/sda1 可能要依照你板子的情况改一下

#!/bin/sh
if [ -b /dev/sda1 ];then
    echo "find usb disk"
else
    echo "don't find usb disk"
    killall omxplayer
fi


如果没问题的话,定时运行这个代码就可以了
可以写成这样,定时的周期可以改sleep后面的参数,现在是2秒钟。

#!/bin/sh
while [ "1" = "1" ]
do
    if [ -b /dev/sda8 ];then
      echo "find usb disk"
    else
      echo "don't find usb disk"
      killall omxplayer
    fi
    sleep 2s
done




算是救急的可行方案之一吧。

honami520 发表于 2015-10-21 12:06:51

能做的,直接联系楼主,一手交钱一手交货;
不能做的,没做过的,就别在这里瞎出主意了。

Excellence 发表于 2015-10-21 12:39:40

刚开始PYTHON,帮不上忙,帮顶。

splfsp 发表于 2015-10-21 12:52:42

dhbighead 发表于 2015-10-21 11:48
能试试 插拔U盘前后 /dev/目录下文件的区别吗?

然后试试运行这个代码,直接复制,然后粘贴到命令行里面 ...

这样应该不行吧? sda1并不是USB拔出后立马消失的,还存在一会,因为缓冲的原因,

splfsp 发表于 2015-10-21 12:53:17

honami520 发表于 2015-10-21 12:06
能做的,直接联系楼主,一手交钱一手交货;
不能做的,没做过的,就别在这里瞎出主意了。 ...

有人出主意总是好的,就怕没人理啊

hyghyg1234 发表于 2015-10-21 13:07:53

玩树莓派的不少啊。

dhbighead 发表于 2015-10-21 13:15:12

splfsp 发表于 2015-10-21 12:52
这样应该不行吧? sda1并不是USB拔出后立马消失的,还存在一会,因为缓冲的原因, ...

那交叉编译后的omxplayer估计也没法达到这种效果的,应该也是类似的原理吧。

qs6361036 发表于 2015-10-21 13:23:07

没玩过树莓派

xaper 发表于 2015-10-21 13:26:24

再写个监视进程,进程间通信,超时kill 播放器

菜包 发表于 2015-10-21 13:28:58

splfsp 发表于 2015-10-21 11:30
强行kill后重新运行可以正常播放,我的程序里kill不行,因为有可能这时候程序已经死掉了,U盘拔出后运行 ...

用udev的规则啊,你的系统支持udev的吧,给你举个简单例子:

udev自动挂载:
1. 在/etc/udev/rules.d创建规则文件"11-add-udisk.rules"(文件名可以取别的,但是后缀必须是.rules)
文件内容如下:
       action!="add",goto="exit_add_udisk"
      kernel=="sd",run+="/sbin/auto-mount-udisk.sh %k"
      label="exit_add_udisk"
如果你的U盘插入之后,在/dev/下的设备名不是sd*(比如sda1),那么就自己根据你板子的情况修改kernel=="sd"成你的U盘设备名

2. 在/sbin/创建一个脚本文件auto-mount-udisk.sh挂载U盘,脚本文件名对应上面规则中的文件名,脚本文件要有可执行权限
文件内容如下:
      #!/bin/sh
      # Create U-Disk Mount Point
      if [ ! -d /mnt/udisk ]; then
            mkdir /mnt/udisk
      fi
      # Mount U-Disk, Param 1 is device name
      /bin/mount -t vfat /dev/$1 /mnt/udisk
      sync

这样当U盘插入之后,就会自动执行挂载脚本,将U盘分区挂载到/mnt/udisk

udev自动卸载也差不多:
1. 创建"11-remove-udisk.rules"规则
文件内容如下:
      action !="remove",goto="exit_remove_udisk"
      subsystem!="block",goto="exit_remove_udisk"
      kernel=="sd",run+="/sbin/auto-umount-udisk.sh"
      label="exit_remove_udisk"

2. 在/sbin/创建一个脚本文件auto-umount-udisk.sh挂载U盘,脚本文件名对应上面规则中的文件名,脚本文件要有可执行权限
文件内容如下:
      #!/bin/sh
      sync
        # Kill omxplayer
        killall omxplayer
      # Umount U-Disk
      /bin/umount /mnt/udisk
      # 你可以在这做其他的清理工作,并通知主程序……

这样就实现U盘拔出时自动卸载和关闭播放器了,希望对你有帮助吧
我手上没树莓派的板子,也不清楚你的具体系统环境,但这个方法在大部分linux系统中都是可行的,只要你的linux支持udev,上面这个方法应该就能用
如果你的系统不支持udev但是支持mdev的话也可以用类似的方法,可以自己百度一下

splfsp 发表于 2015-10-21 13:29:30

dhbighead 发表于 2015-10-21 13:15
那交叉编译后的omxplayer估计也没法达到这种效果的,应该也是类似的原理吧。 ...

重新编译omxplayer的话,应该可以这样啊,就是omxplayer读不到数据了,就退出,不要死等循环之类的

splfsp 发表于 2015-10-21 13:34:44

菜包 发表于 2015-10-21 13:28
用udev的规则啊,你的系统支持udev的吧,给你举个简单例子:

udev自动挂载:


好,我消化下,尝试下,谢谢您花这么多时间来帮忙和回复啊

splfsp 发表于 2015-10-21 13:36:30

xaper 发表于 2015-10-21 13:26
再写个监视进程,进程间通信,超时kill 播放器

死机的时候很彻底

k_ewell 发表于 2015-10-21 13:37:06



1: linux内核要打开hotplug功能,可通过检查是否存在/proc/sys/kernel/hotplug文件来确认
2: 系统启动时文件系统里执行/bin/echo /sbin/mdev > /proc/sys/kernel/hotplug ,表示热拔插事件用mdev程序处理
3: 然后文件系统执行mdev -s,mdev可以单独找源码编辑或从busybox中生成

    其中,mdev默认使用/etc/mdev.conf配置文件,可以参考我设备的使用的启动命令和配置文件

# cat inittab | grep "mdev"
#Use mdev as hotplug to auto mount USB storage or SD card
::sysinit:/bin/echo /sbin/mdev > /proc/sys/kernel/hotplug
::sysinit:/sbin/mdev -s
#

# cat mdev.conf
sd      0:0 0777      @(mount /dev/$MDEV /media/usb && if [ -s /media/usb/autorun ];then sh /media/usb/autorun;fi)#添加u盘时还要做什么事情可以在这里添加
sd         0:0 0777      $(umount /media/usb)#拔掉u盘时还要做什么事情可以在这里添加
ub      0:0 0777      @(mount /dev/$MDEV /media/usb && if [ -s /media/usb/autorun ];then sh /media/usb/autorun;fi)
ub         0:0 0777      $(umount /media/usb)
mmcblkp 0:0 0777      @(mount /dev/$MDEV /media/sdc && if [ -s /media/sdc/autorun ];then sh /media/sdc/autorun;fi)
mmcblk       0:0 0777      $(umount /media/sdc)

starli 发表于 2015-10-21 14:36:38

楼主解决了吗?

cyberkyg 发表于 2015-10-21 15:09:55

mark                               .

splfsp 发表于 2015-10-21 15:10:44

starli 发表于 2015-10-21 14:36
楼主解决了吗?

正在痛苦中

splfsp 发表于 2015-10-21 15:19:32

菜包 发表于 2015-10-21 13:28
用udev的规则啊,你的系统支持udev的吧,给你举个简单例子:

udev自动挂载:


按照上面的 U盘没有自动挂载,,从网上搜到的可以实现自动挂载

       
sudo nano /etc/udev/rules.d/10-usbstorage.rules

复制粘贴这个脚本到编辑窗口
       
KERNEL!="sd*", GOTO="media_by_label_auto_mount_end"
SUBSYSTEM!="block",GOTO="media_by_label_auto_mount_end"
IMPORT{program}="/sbin/blkid -o udev -p %N"
ENV{ID_FS_TYPE}=="", GOTO="media_by_label_auto_mount_end"
ENV{ID_FS_LABEL}!="", ENV{dir_name}="%E{ID_FS_LABEL}"
ENV{ID_FS_LABEL}=="", ENV{dir_name}="Untitled-%k"
ACTION=="add", ENV{mount_options}="relatime,sync"
ACTION=="add", ENV{ID_FS_TYPE}=="vfat", ENV{mount_options}="iocharset=utf8,umask=000"
ACTION=="add", ENV{ID_FS_TYPE}=="ntfs", ENV{mount_options}="iocharset=utf8,umask=000"
ACTION=="add", RUN+="/bin/mkdir -p /media/%E{dir_name}", RUN+="/bin/mount -o $env{mount_options} /dev/%k /media/%E{dir_name}"
ACTION=="remove", ENV{dir_name}!="", RUN+="/bin/umount -l /media/%E{dir_name}", RUN+="/bin/rmdir /media/%E{dir_name}"
LABEL="media_by_label_auto_mount_end"


能不能通过修改这段代码实现U盘拔下时kill掉omxplayer呢?

ywhbn 发表于 2015-10-21 16:03:11

楼主把python程序发上来,帮你改改看

菜包 发表于 2015-10-21 16:14:01

splfsp 发表于 2015-10-21 15:19
按照上面的 U盘没有自动挂载,,从网上搜到的可以实现自动挂载

       


在ACTION=="remove"那行的run里面加上kill命令就行了,你贴的这个跟我给的差不多啊,估计是你的sh执行脚本没搞好,所以u盘才挂不上

ackyee 发表于 2015-10-21 16:25:20

虽然不懂纯帮顶

splfsp 发表于 2015-10-21 17:25:38

菜包 发表于 2015-10-21 16:14
在ACTION=="remove"那行的run里面加上kill命令就行了,你贴的这个跟我给的差不多啊,估计是你的sh执行脚 ...

在ACTION=="remove"那行的run里面加上 RUN+="killall omxplayer",

保存重启后试着用命令终端打开omxplayer播放系统里的视频,拔出U盘时,omxplayer没有退出啊,我上面有什么错误?

菜包 发表于 2015-10-21 17:36:49

splfsp 发表于 2015-10-21 17:25
在ACTION=="remove"那行的run里面加上 RUN+="killall omxplayer",

保存重启后试着用命令终端打开omxpla ...

试试 /bin/killall omxplayer

你运行omxplayer的时候,用killall omxplayer可以关闭播放器吗?

ywhbn 发表于 2015-10-21 19:09:22

splfsp 发表于 2015-10-21 17:25
在ACTION=="remove"那行的run里面加上 RUN+="killall omxplayer",

保存重启后试着用命令终端打开omxpla ...

不用折腾omxplayer和udev rules,稍微改改python应该就能实现:omxplayer crash但是python主程序不crash

splfsp 发表于 2015-10-21 19:15:04

菜包 发表于 2015-10-21 17:36
试试 /bin/killall omxplayer

你运行omxplayer的时候,用killall omxplayer可以关闭播放器吗? ...

我其实是用 pkill -9 omxplayer,程序中调用这条是可以kill掉omxplayer的,但脚本里还是不行,加上/bin还是不行

splfsp 发表于 2015-10-21 19:16:37

ywhbn 发表于 2015-10-21 19:09
不用折腾omxplayer和udev rules,稍微改改python应该就能实现:omxplayer crash但是python主程序不crash ...

望大师详细指点迷津啊

ywhbn 发表于 2015-10-21 20:22:44

本帖最后由 ywhbn 于 2015-10-21 20:24 编辑

python主程序fork出一个子进程,把omxplayer放到子进程里运行

ywhbn 发表于 2015-10-21 20:24:27

splfsp 发表于 2015-10-21 19:16
望大师详细指点迷津啊

python主程序fork出一个子进程,把omxplayer放到子进程里运行,像这样
#!/usr/bin/python

import os

if __name__ == '__main__':
    pid = os.fork()
    if pid == 0:
      os.execv('./crash_me', [""])
    else:
      os.wait()
      print pid
python主程序会等crash_me退出。就算crash_me Segmentation fault了,python主程序也没事

菜包 发表于 2015-10-21 20:45:37

splfsp 发表于 2015-10-21 19:15
我其实是用 pkill -9 omxplayer,程序中调用这条是可以kill掉omxplayer的,但脚本里还是不行,加上/bin还 ...

这样,你先写个脚本,不管用什么命令,保证手动运行之后能关闭omxplayer的,然后再在USB事件中调用这个脚本

splfsp 发表于 2015-10-22 10:53:13

我发现在联网的情况下,突然拔掉U盘就不会死机,这个我感觉稍微修改下代码重新编译,肯定是可以满足我的需求的,可是我不会啊{:cry:}

ywhbn 发表于 2015-10-22 12:45:18

splfsp 发表于 2015-10-22 10:53
我发现在联网的情况下,突然拔掉U盘就不会死机,这个我感觉稍微修改下代码重新编译,肯定是可以满足我的需 ...

你试了我的那段代码了吗

rei1984 发表于 2015-10-22 14:30:21

linux有难度啊

hexenzhou 发表于 2015-10-24 11:09:03

这里Linux高手好多,受教了,“ywhbn”大神的监测程序Crash的方法倒是对我很有用,我的程序有时莫名其妙的当掉,用这个方法估计可以实现自动重启。{:titter:}

netawater 发表于 2015-10-24 14:20:57

splfsp 发表于 2015-10-22 10:53
我发现在联网的情况下,突然拔掉U盘就不会死机,这个我感觉稍微修改下代码重新编译,肯定是可以满足我的需 ...

楼主有还有需要吗?Q联系:68697211

splfsp 发表于 2015-10-24 19:04:15

ywhbn 发表于 2015-10-22 12:45
你试了我的那段代码了吗

前几天论坛被攻击了,一直没进来,还没试

splfsp 发表于 2015-10-24 19:07:44

netawater 发表于 2015-10-24 14:20
楼主有还有需要吗?Q联系:68697211

已发QQ验证
页: [1]
查看完整版本: 出3000元软妹币求助重新编译树莓派omxplayer,实现自己的功能