出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:23
钱少,高手不要看不上啊,静静等待
我编译一下试试看吧。。
不是高手。。看看能不能解决问题 dhbighead 发表于 2015-10-21 10:24
我编译一下试试看吧。。
不是高手。。看看能不能解决问题
谢谢,应该要改下小部分代码,就是要正在读取的文件消失的话,omxplayer程序退出 omxplayer不行的话,就移植mplayer呗,这么多播放器非得用它啊? sblpp 发表于 2015-10-21 10:32
omxplayer不行的话,就移植mplayer呗,这么多播放器非得用它啊?
因为在树莓派上,只有这个播放器是硬解的,其它的自己移植实现硬解功能,对我难度更大啊 静静等待 顶一顶,不要下沉 omxplayer在运行中强行kill掉之后再重新运行,能不能正常播放?如果能正常播放的话就可以试试下面的方法:
用udev消息加脚本行不行,U盘拔出后运行一个脚本,umount掉U盘,然后关闭omxplayer,可以向omxplayer线程发信号让它正常关闭,并等一段时间,若omxplayer仍在运行就强制kill掉,omxplayer结束运行之后向你的程序发个消息,你的程序再做其他处理 都上操作系统了,跟电脑类似环境了。 播放软件代码太复杂,通过别的方式应该也可以吧。 比如开机运行一个小程序,检测U盘和播放软件。U盘被拔掉后对播放软件进行干预。 菜包 发表于 2015-10-21 11:16
omxplayer在运行中强行kill掉之后再重新运行,能不能正常播放?如果能正常播放的话就可以试试下面的方法:
...
强行kill后重新运行可以正常播放,我的程序里kill不行,因为有可能这时候程序已经死掉了,U盘拔出后运行一个脚本,umount掉U盘,强制kill掉omxplayer应该可以。
这种脚本可以有吗?就是U盘插上后就mount U盘,U盘拔掉时,umount掉U盘,强制kill掉omxplayer。不需要跟我程序通信。
但我对这个不熟悉,不会弄脚本,您能抽点时间帮我解决下吗? huangqi412 发表于 2015-10-21 11:29
都上操作系统了,跟电脑类似环境了。 播放软件代码太复杂,通过别的方式应该也可以吧。 比如开机运行一 ...
这样也可以,但我不会啊,献血来不及啊,时间短,dabian里检测U盘拔出我都没有做好,现在是通过检测文件夹是否存在来弄的,但这样有弊端,拔出一会后文件夹才消失 本帖最后由 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
算是救急的可行方案之一吧。
能做的,直接联系楼主,一手交钱一手交货;
不能做的,没做过的,就别在这里瞎出主意了。 刚开始PYTHON,帮不上忙,帮顶。 dhbighead 发表于 2015-10-21 11:48
能试试 插拔U盘前后 /dev/目录下文件的区别吗?
然后试试运行这个代码,直接复制,然后粘贴到命令行里面 ...
这样应该不行吧? sda1并不是USB拔出后立马消失的,还存在一会,因为缓冲的原因, honami520 发表于 2015-10-21 12:06
能做的,直接联系楼主,一手交钱一手交货;
不能做的,没做过的,就别在这里瞎出主意了。 ...
有人出主意总是好的,就怕没人理啊 玩树莓派的不少啊。 splfsp 发表于 2015-10-21 12:52
这样应该不行吧? sda1并不是USB拔出后立马消失的,还存在一会,因为缓冲的原因, ...
那交叉编译后的omxplayer估计也没法达到这种效果的,应该也是类似的原理吧。 没玩过树莓派 再写个监视进程,进程间通信,超时kill 播放器 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的话也可以用类似的方法,可以自己百度一下
dhbighead 发表于 2015-10-21 13:15
那交叉编译后的omxplayer估计也没法达到这种效果的,应该也是类似的原理吧。 ...
重新编译omxplayer的话,应该可以这样啊,就是omxplayer读不到数据了,就退出,不要死等循环之类的 菜包 发表于 2015-10-21 13:28
用udev的规则啊,你的系统支持udev的吧,给你举个简单例子:
udev自动挂载:
好,我消化下,尝试下,谢谢您花这么多时间来帮忙和回复啊 xaper 发表于 2015-10-21 13:26
再写个监视进程,进程间通信,超时kill 播放器
死机的时候很彻底
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) 楼主解决了吗? mark . starli 发表于 2015-10-21 14:36
楼主解决了吗?
正在痛苦中 菜包 发表于 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呢? 楼主把python程序发上来,帮你改改看 splfsp 发表于 2015-10-21 15:19
按照上面的 U盘没有自动挂载,,从网上搜到的可以实现自动挂载
在ACTION=="remove"那行的run里面加上kill命令就行了,你贴的这个跟我给的差不多啊,估计是你的sh执行脚本没搞好,所以u盘才挂不上 虽然不懂纯帮顶 菜包 发表于 2015-10-21 16:14
在ACTION=="remove"那行的run里面加上kill命令就行了,你贴的这个跟我给的差不多啊,估计是你的sh执行脚 ...
在ACTION=="remove"那行的run里面加上 RUN+="killall omxplayer",
保存重启后试着用命令终端打开omxplayer播放系统里的视频,拔出U盘时,omxplayer没有退出啊,我上面有什么错误? splfsp 发表于 2015-10-21 17:25
在ACTION=="remove"那行的run里面加上 RUN+="killall omxplayer",
保存重启后试着用命令终端打开omxpla ...
试试 /bin/killall omxplayer
你运行omxplayer的时候,用killall omxplayer可以关闭播放器吗? splfsp 发表于 2015-10-21 17:25
在ACTION=="remove"那行的run里面加上 RUN+="killall omxplayer",
保存重启后试着用命令终端打开omxpla ...
不用折腾omxplayer和udev rules,稍微改改python应该就能实现:omxplayer crash但是python主程序不crash 菜包 发表于 2015-10-21 17:36
试试 /bin/killall omxplayer
你运行omxplayer的时候,用killall omxplayer可以关闭播放器吗? ...
我其实是用 pkill -9 omxplayer,程序中调用这条是可以kill掉omxplayer的,但脚本里还是不行,加上/bin还是不行 ywhbn 发表于 2015-10-21 19:09
不用折腾omxplayer和udev rules,稍微改改python应该就能实现:omxplayer crash但是python主程序不crash ...
望大师详细指点迷津啊 本帖最后由 ywhbn 于 2015-10-21 20:24 编辑
python主程序fork出一个子进程,把omxplayer放到子进程里运行 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主程序也没事 splfsp 发表于 2015-10-21 19:15
我其实是用 pkill -9 omxplayer,程序中调用这条是可以kill掉omxplayer的,但脚本里还是不行,加上/bin还 ...
这样,你先写个脚本,不管用什么命令,保证手动运行之后能关闭omxplayer的,然后再在USB事件中调用这个脚本
我发现在联网的情况下,突然拔掉U盘就不会死机,这个我感觉稍微修改下代码重新编译,肯定是可以满足我的需求的,可是我不会啊{:cry:} splfsp 发表于 2015-10-22 10:53
我发现在联网的情况下,突然拔掉U盘就不会死机,这个我感觉稍微修改下代码重新编译,肯定是可以满足我的需 ...
你试了我的那段代码了吗 linux有难度啊 这里Linux高手好多,受教了,“ywhbn”大神的监测程序Crash的方法倒是对我很有用,我的程序有时莫名其妙的当掉,用这个方法估计可以实现自动重启。{:titter:} splfsp 发表于 2015-10-22 10:53
我发现在联网的情况下,突然拔掉U盘就不会死机,这个我感觉稍微修改下代码重新编译,肯定是可以满足我的需 ...
楼主有还有需要吗?Q联系:68697211 ywhbn 发表于 2015-10-22 12:45
你试了我的那段代码了吗
前几天论坛被攻击了,一直没进来,还没试 netawater 发表于 2015-10-24 14:20
楼主有还有需要吗?Q联系:68697211
已发QQ验证
页:
[1]