mplayer的执行过程分析(本地、网络)

mplayer的执行过程分析(本地、网络)

main函数流程分析,分本地和网络两种情况 

1. 本地文件的播放,以mp3文件的播放为例,命令行输入:mplayer test.mp3 
   只给出关键步骤 
2. open_stream,                                        打开文件流 
        open_stream_full                                找到合适的打开文件的方式,对于本地文件选择 
            open_stream_plugin                          stream_info_file,使用它的open_f函数读取文件 
                open_f                                  成功,返回文件句柄,文件访问函数 
   对于流媒体文件,第8行改成如下的第10行,表明流媒体文件选择stream_info_rtsp_sip 
                open_live_rtsp_sip 
                                  
3. mpctx->stream                                        2854行,记录文件流的信息,文件句柄,访问函数等 
4. demux_open                                           打开分离器(音视频) 
        demux_open_stream                               从demuxer_list中找到合适的demuxer描述符,此处为demuxer_desc_audio 
            new_demuxer 
                stream_seek 
                    cache_stream_seek_long 
                        stream_seek_long                读取部分数据至内存 
                            stream_fill_buffer          while(stream_fill_buffer(s) > 0 && pos >= 0) { 
                                
            demux_audio_open                            使用demuxer_desc_audio的打开函数,读取媒体数据的信息,头信息 
                                                        对于m4v视频demuxer_desc_lavf_preferred,打开demux_open_lavf 
   对于流媒体文件,上面的第15行换成如下的第18行,使用demuxer_desc_rtp,使用sdp文件建立流媒体会话, 
            demux_open_rtp                              创建媒体会话,创建音视频数据接收会话,初始化音视频的codec 
                          
初始化视频解码器及输出设备 
5. reinit_video_chain 
        init_best_video_out                             从video_out_drivers数组中找出视频输出设备video_out_gl 
            preinit(vo_gl.c) 
        vf_open_filter                                  在众多驱动中过滤出需要的那种 
            vf_open_plugin 
                open(vf_vo.c)                           vf_info_vo 
        init_best_video_codec                           
            init_video                                  初始化视频解码器,从mpcodecs_vd_drivers数组中选择合适的解码器 
                                                        选择mpcodecs_vd_ffmpeg解码m4v的视频文件,vd_ffmpeg.c 
初始化音频解码器及输出设备                                                         
6. reinit_audio_chain 
        init_best_audio_codec                           mpcodecs_ad_drivers(见LIBAD_EXTERN(mp3lib)),ad_internal.h 
            init_audio                                  选择mpcodecs_ad_mp3lib解码mp3的音频文件 
        init_best_audio_out                             从audio_out_drivers选择音频输出设备audio_out_win32 
            init                                        初始化 
开始播放 
音频,mp3 
7. fill_audio_out_buffers 
        decode_audio                                    dec_audio.c 
            mpadec->decode_audio 
            MP3_DecodeFrame                             获取数据并解码 
                read_frame 
                    stream_read_frame_body 
                        mp3_read 
                            mplayer_audio_read 
                                demux_read_data 
                                    ds_fill_buffer 
                                        demux_fill_buffer 
                                            demux_audio_fill_buffer(demux_audio.c) 
                                                stream_read 
                                                    cache_stream_fill_buffer 
                                                        stream_fill_buffer 
                                                            fill_buffer(stream_file.c) 
        如果是流媒体,上面的47行将变为:     demux_rtp_fill_buffer(demux_rtp.cpp)                                                     
        play 
            write_waveOutBuffer 
视频 
8. update_video 
        video_read_frame 
            read_video_packet 
                demux_pattern_3 
                    demux_read_data 
                        ds_fill_buffer 
                            demux_fill_buffer 
                                demux_lavf_fill_buffer(m4v) 
        对于流媒体的视频,上面的一行将变为: 
                                demux_rtp_fill_buffer(demux_rtp.cpp)                         
        decode_video 
            decode(vd_ffmpeg.c)                         avctx->opaque=sh; 在 
        filter_video 
            put_image(vf_vo.c)     
            
            
========================================================================================= 
另一种读取视频文件的过程: 
demux_mpg_es_fill_buffer 
    ds_read_packet 
        stream_read 
            cache_stream_fill_buffer 
                stream_fill_buffer                      read 
                default:s->fill_buffer 
                    fill_buffer                         stream_file.c 
windows下的界面部分,由编译开关HAVE_NEW_GUI控制 
mplayer.c文件下的 
2661~2668行,界面初始化 
2692~2727行,界面的消息循环,获取用户的命令,如文件名,执行 

视频驱动如果是directx,相应的处理函数在vo_directx.c文件中     
ffmpeg编解码器中的avcodec_decode_video函数可以解析出视频的规格,即高和宽 
ff_h263_decode_frame 
ff_mpeg4_decode_picture_header解析MPEG4视频的头信息 
decode_vol_header解析出高和宽   

具体过程如下: 

avcodec_decode_video 
    ff_h263_decode_frame 
        MPV_frame_start 
            alloc_picture 
                ff_mpeg4_decode_picture_header          解析出高和宽 
                get_buffer 
                    init_vo 
                        mpcodecs_config_vo              打印到屏幕                                                                                                                     

网络流媒体的视频高和宽必须解码才能获取,过程如下: 

如何从一个音视频文件中分出音视频流? 
参考m4v_demuxer,分离器使用宏REGISTER_DEMUXER注册或REGISTER_MUXDEMUX,见allformats.c文件 
lavf_check_file在打开之前运行,从而获取真正的demuxer 
对于.m4v文件,打开demux_open_lavf中av_open_input_stream获取流信息,音频视频 
demux_open_stream时,new_demuxer开辟音视频流的缓存 
文件扩展名是.mp4时,打开流mov_read_header,首先重置音视频部分: 
stream_reset 
    s->control(demux_mov_control) 
    
    
    
对于mp4流媒体
根据sdp初始化:
    bih->biCompression = sh_video->format
      = mmioFOURCC('m','p','4','v');
      
确定视频解码器:
init_video中find_video_codec,使用上面的biCompression到文件codecs.conf文件中找到ffodivx,对于的
驱动为ffmpeg         

posted on 2015-01-05 17:12 竞击 阅读( ...) 评论( ...) 编辑 收藏
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
再次更新,添加RGA100支持,添加LED触发器类型, 删除了按钮脚本,要自定义功能自己写脚本放在/etc/hotplud.d/button/ 下面 openwrt-RG100A_DB120-squashfs-cfe.bin http://115.com/file/c2bjz3px# 我的DB120-WG,双UBS,看着那么多的LED无法使用,于是泡论坛,看教程, 经过无数次的make, make V=99,终于修正了DB120的所有LED驱动,共9个LED, power和internet为双色LED,触发用time, 调整红色和绿色分量,可以显示绿色,橙色,红色等, 美中不足的是红灯太亮了,绿灯太弱,有条件的换下LED限流电阻 2012-2-1 增加了3个按钮 BTN_0 RESET 按住8秒后放开,系统复位 BTN_1 WLAN 无线开关 BTN_2 WPS umount 以后不要手贱,随便捅菊花了,结果你懂的 基本完美了,发挥你的想象吧 集成的软件都是我自己要用的,如motion做监控,图片保存在移动硬盘上, 当画面有变化时 mutt和ssmtp 发送邮件到139邮箱,有实时短信提醒. 通过N2N,配合视频监控软件可以随时随地查看家里状况 看到有个帖子里面用用Mplayer网络收音机,又塞了个mplayer进去 集成USB声卡驱动,基本影音全能了 基于官方 OpenWrt Backfire 10.03.1 编译而成 软件包名称 版本 alsa-lib 1.0.24.1-1 alsa-utils 1.0.24.2-1 base-files 43.32-r29685 block-mount 0.1.0-2.2 bridge 1.4-1 busybox 1.15.3-3.4 bzip2 1.0.6-1 crda 1.1.1-1 dnsmasq 2.55-6.1 dropbear 0.53.1-5 firewall 2-34.8 gpioctl 1.0-1 hd-idle 1.03-1 hotplug2 1.0-beta-3 iptables 1.4.6-3.1 iptables-mod-conntrack 1.4.6-3.1 iptables-mod-conntrack-extra 1.4.6-3.1 iptables-mod-filter 1.4.6-3.1 iptables-mod-imq 1.4.6-3.1 iptables-mod-ipopt 1.4.6-3.1 iptables-mod-nat 1.4.6-3.1 iw 0.9.22-2 kernel 2.6.32.27-1 kmod-b43 2.6.32.27+2011-12-01-1 kmod-button-hotplug 2.6.32.27-1 kmod-cfg80211 2.6.32.27+2011-12-01-1 kmod-crc-ccitt 2.6.32.27-1 kmod-crypto-aes 2.6.32.27-1 kmod-crypto-arc4 2.6.32.27-1 kmod-crypto-core 2.6.32.27-1 kmod-fs-ext2 2.6.32.27-1 kmod-fs-ext3 2.6.32.27-1 kmod-fuse 2.6.32.27-1 kmod-i2c-core 2.6.32.27-1 kmod-input-core 2.6.32.27-1 kmod-input-gpio-buttons 2.6.32.27-1 kmod-input-polldev 2.6.32.27-1 kmod-ipt-conntrack 2.6.32.27-1 kmod-ipt-conntrack-extra 2.6.32.27-1 kmod-ipt-core 2.6.32.27-1 kmod-ipt-filter 2.6.32.27-1 kmod-ipt-imq 2.6.32.27-1 kmod-ipt-ipopt 2.6.32.27-1 kmod-ipt-nat 2.6.32.27-1 kmod-mac80211 2.6.32.27+2011-12-01-1 kmod-nls-cp437 2.6.32.27-1 kmod-nls-iso8859-1 2.6.32.27-1 kmod-nls-utf8 2.6.32.27-1 kmod-ppp 2.6.32.27-1 kmod-sched 2.6.32.27-1 kmod-scsi-core 2.6.32.27-1 kmod-sound-core 2.6.32.27-1 kmod-switch 2.6.32.27-4 kmod-textsearch 2.6.32.27-1 kmod-tun 2.6.32.27-1 kmod-usb-audio 2.6.32.27-1 kmod-usb-core 2.6.32.27-1 kmod-usb-ohci 2.6.32.27-1 kmod-usb-printer 2.6.32.27-1 kmod-usb-storage 2.6.32.27-1 kmod-usb-uhci 2.6.32.27-1 kmod-usb2 2.6.32.27-1 kmod-video-core 2.6.32.27-1 kmod-video-uvc 2.6.32.27-1 kmod-zd1211rw 2.6.32.27+2011-12-01-1 lame-lib 398-2-3 libao 1.1.0-1 libc 0.9.30.1-43.32 libevent 1.4.14b-1 libfaad2 2.7-1 libffmpeg 0.5.4-2 libfuse 2.8.3-1 libgcc 4.3.3+cs-43.32 libgsm 1.0.13-1 libiconv 5 libiconv-full 1.11.1-1 libid3tag 0.15.1b-3 libip4tc 1.4.6-3.1 libiwinfo 18 libiwinfo-lua 18 libjpeg 6b-1 libltdl 2.4-1 liblua 5.1.4-7 liblzo 2.04-1 libmad 0.15.1b-3 libncurses 5.7-2 libnl-tiny 0.1-1 libogg 1.1.4-2 libopenssl 0.9.8s-1 libpthread 0.9.30.1-43.32 librrd1 1.0.50-1 librt 0.9.30.1-43.32 libsamplerate 0.1.7-1 libsndfile 1.0.21-1 libuci 12012009.7-4 libuci-lua 12012009.7-4 libusb-1.0 1.0.8-1 libv4l 0.6.1-1 libvorbis 1.2.3-1 libvorbisidec 1.0.2+svn14261-1 libxtables 1.4.6-3.1 lua 5.1.4-7 luci 0.10.0-1 luci-app-firewall 0.10.0-1 luci-app-hd-idle 0.10.0-1 luci-app-ntpc 0.10.0-1 luci-app-qos 0.10.0-1 luci-app-samba 0.10.0-1 luci-app-voice-core 0.10.0-1 luci-i18n-chinese 0.10.0-1 luci-i18n-english 0.10.0-1 luci-lib-core 0.10.0-1 luci-lib-ipkg 0.10.0-1 luci-lib-lmo 0.10.0-1 luci-lib-lucid 0.10.0-1 luci-lib-lucid-http 0.10.0-1 luci-lib-nixio 0.10.0-1 luci-lib-px5g 0.10.0-1 luci-lib-sys 0.10.0-1 luci-lib-web 0.10.0-1 luci-mod-admin-core 0.10.0-1 luci-mod-admin-full 0.10.0-1 luci-proto-core 0.10.0-1 luci-proto-ppp 0.10.0-1 luci-sgi-cgi 0.10.0-1 luci-theme-base 0.10.0-1 luci-theme-openwrt 0.10.0-1 mjpg-streamer r136-1 motion 3.2.11.1-1 mtd 13 mutt 1.5.21-1 n2n 3875-1 ntfs-3g 2011.4.12-1-fuseext ntpclient 2007_365-4 openssl-util 0.9.8s-1 opkg 576-2 qos-scripts 1.2.1-3.2 resolveip 1 samba3 3.0.24-8 screen 4.0.3-2 sox 14.0.1-3 ssmtp 2.64-3 tc 2.6.29-1-2 uci 12012009.7-4 udevtrigger 106-1 uhttpd 28 usbutils 003-1 wireless-tools 29-4 wpad-mini 20111103-2 zlib 1.2.3-5

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值