青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

socketref,再見!高德

https://github.com/adoggie

  C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
  246 Posts :: 4 Stories :: 312 Comments :: 0 Trackbacks

常用鏈接

留言簿(54)

我參與的團隊

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

寫代碼,寫好代碼其實并不難,但如果要做好文檔,能完整闡述清楚自己的構思、想法和邏輯結構,這比較難,自己也缺少這方面的耐心。
很多opensource的代碼根本不需要文檔也能一目了然,這是一種定力
多年前的項目中使用到python和ffmpeg, 網絡上搜索了一下,均不能滿足自己的要求。ffmpeg的python綁定提供的均是文件級的訪問控制,也就是說沒有暴露更多的可控接口來用。
所以還是一切都自己來做
ffmpeg采用0.81版本以上,當時發現mov文件在0.71以下無法正常解碼,到0.81則解決了此問題。
python包裝ffmpeg的方式很多,最好的可能就是swig,但太煩了,最后選擇ctypes來訪問ffmpeg接口。 
如果直接使用ffmpeg的api接口也不太合適,因為要暴露很多ffmpeg的接口、數據類型、常數定義等。
所以我是這么處理:   
  1. 編寫一個功能動態庫來包裝ffmpeg,提供基本的業務功能 ,屏蔽ffmpeg細節,這里叫ffmpeg_media_codec.dll
  2. 用ctypes包裝此ffmpeg_media_codec.dll,這里是ffmpeg.py
  3. 業務代碼使用ffmpeg.py提供的接口訪問、解碼多媒體文件 
代碼: http://sw2us.com/static/projects/py-ffmpeg/

ffmpeg_media_codec.dll 暴露的c接口 

 1 ffmpeg lib interface list:
 2 ===========================
 4 typedef unsigned char  StreamByte_t;
 6 struct MediaStreamInfo_t{
 7     int codec_type;
 8     int codec_id;
 9     int width;
10     int height;
11     int gopsize;
12     int pixfmt;
13     int tb_num;
14     int tb_den;
15     int bitrate;
16     int frame_number;
17     int videostream; //視頻流編號
18 };
19 
20 struct MediaVideoFrame_t{
21     StreamByte_t *    rgb24;
22     size_t            size;
23     int                width;
24     int                height;
25     unsigned int    sequence; //控制播放順序
26     unsigned int    duration; //播放時間
27 };
28 
29 struct MediaPacket_t{
30      StreamByte_t*    data;
31      size_t            size;
32     AVPacket    *    pkt;
33     int                stream;    //流編號 
34     int                dts;
35     int                pts;
36     size_t            sequence;
37     size_t            duration;
39 };
40 
41 struct MediaFormatContext_t;
42 
43 //解碼器
44 struct MediaCodecContext_t{
45     AVCodecContext * codecCtx;    //AVCodecContext*
46     AVCodec *        codec;    
47     int                stream; //流編號
48     AVFrame *        rgbframe24; //
49     AVFrame*        frame;    //
50     StreamByte_t*    buffer;
51     size_t            bufsize;
52     void *            user;
53     MediaStreamInfo_t si;
54 };
55 
56 struct MediaFormatContext_t{
57     AVFormatContext * fc; //AVFormatContext* 
58     MediaStreamInfo_t video;    //視頻信息
60 };
66 #ifdef __cplusplus
67  extern "C" {  
68 #endif
69 
70 int InitLib();         //初始化解碼庫
71 void Cleanup();    //
73 MediaCodecContext_t* InitAvCodec(MediaStreamInfo_t* si);    //根據媒體類型分配解碼器對象
74 void FreeAvCodec(MediaCodecContext_t* codec);                  //釋放解碼器對象
76 MediaVideoFrame_t * DecodeVideoFrame(MediaCodecContext_t* ctx,MediaPacket_t* pkt);  //送入媒體包進行解碼,返回視頻幀
77 void FreeVideoFrame(MediaVideoFrame_t* frame);                  //釋放視頻幀
79 MediaPacket_t * AllocPacket();                                             //分配一個流媒體包對象(用于網傳)
80 void FreePacket(MediaPacket_t* pkt);                                    //釋放流媒體包
82 MediaFormatContext_t* InitAvFormatContext(char * file);          //媒體文件訪問上下文,申請
83 void FreeAvFormatContext(MediaFormatContext_t* ctx);          //釋放
84 MediaPacket_t* ReadNextPacket(MediaFormatContext_t* ctx);   //讀媒體文件一個數據包
85 void ReadReset(MediaFormatContext_t* ctx) ;                //重置媒體訪問讀取位置
86 int SeekToTime(int timesec) ;                                     //跳躍到指定時間

ffmpeg.py 包裝:

  1 import ctypes
  2 from ctypes import *

  5 _lib = cdll.LoadLibrary('ffmpeg.dll')
  6 
  7 _int_types = (c_int16, c_int32)
  8 if hasattr(ctypes, 'c_int64'):
  9     # Some builds of ctypes apparently do not have c_int64
 10     # defined; it's a pretty good bet that these builds do not
 11     # have 64-bit pointers.
 12     _int_types += (ctypes.c_int64,)
 13 for t in _int_types:
 14     if sizeof(t) == sizeof(c_size_t):
 15         c_ptrdiff_t = t
 16 
 17 class c_void(Structure):
 18     # c_void_p is a buggy return type, converting to int, so
 19     # POINTER(None) == c_void_p is actually written as
 20     # POINTER(c_void), so it can be treated as a real pointer.
 21     _fields_ = [('dummy', c_int)]

 26 class MediaStreamInfo_t(Structure):
 27     _fields_ = [
 28         ('codec_type', c_int),
 29         ('codec_id', c_int),
 30         ('width', c_int),
 31         ('height', c_int),
 32         ('gopsize', c_int),
 33         ('pixfmt', c_int),
 34         ('tb_num',c_int),
 35         ('tb_den',c_int),
 36         ('bitrate',c_int),
 37         ('frame_number',c_int),
 38         ('videostream',c_int),
 39         ('duration',c_int),
 40         ('extr',POINTER(c_char)), #解碼器 額外hash表數據
 41         ('extrsize',c_int),
 42     ]
 43 
 44 class MediaVideoFrame_t(Structure):
 45     _fields_=[
 46         ('rgb24',POINTER(c_char)),
 47         ('size',c_uint),
 48         ('width',c_int),
 49         ('height',c_int),
 50         ('sequence',c_uint),
 51         ('duration',c_uint)
 52     ]
 53     
 54 class MediaPacket_t(Structure):
 55     _fields_=[
 56         ('data',POINTER(c_char)),
 57         ('size',c_uint),
 58         ('pkt',c_char_p),
 59         ('stream',c_int),
 60         ('dts',c_int),
 61         ('pts',c_int),
 62         ('sequence',c_uint),
 63         ('duration',c_uint)
 64     ]
 65     
 66     
 67 class MediaCodecContext_t(Structure):
 68     _fields_=[
 69         ('codecCtx',c_char_p),
 70         ('codec',c_char_p),
 71         ('stream',c_int),
 72         ('rgbframe24',c_char_p),
 73         ('frame',c_char_p),
 74         ('buffer',c_char_p),
 75         ('bufsize',c_uint),
 76         ('user',c_char_p),
 77         ('si',MediaStreamInfo_t)
 78     ]    
 79     
 80 class MediaFormatContext_t(Structure):
 81     _fields_=[
 82         ('fc',c_char_p),
 83         ('video',MediaStreamInfo_t)
 84     ]
 85     
 86 InitAvCodec = _lib.InitAvCodec
 87 InitAvCodec.restype = POINTER(MediaCodecContext_t)
 88 InitAvCodec.argtypes = [POINTER(MediaStreamInfo_t)]
 89 
 90 
 91 FreeAvCodec = _lib.FreeAvCodec
 92 FreeAvCodec.restype = None
 93 FreeAvCodec.argtypes = [POINTER(MediaCodecContext_t)]
 96 DecodeVideoFrame = _lib.DecodeVideoFrame
 97 DecodeVideoFrame.restype = POINTER(MediaVideoFrame_t)
 98 DecodeVideoFrame.argtypes = [POINTER(MediaCodecContext_t),POINTER(MediaPacket_t)]
100 FreeVideoFrame = _lib.FreeVideoFrame
101 FreeVideoFrame.restype = None
102 FreeVideoFrame.argtypes = [POINTER(MediaVideoFrame_t)]  
104 AllocPacket = _lib.AllocPacket
105 AllocPacket.restype = POINTER(MediaPacket_t)
106 AllocPacket.argtypes = []
109 FreePacket = _lib.FreePacket
110 FreePacket.restype = None
111 FreePacket.argtypes = [POINTER(MediaPacket_t),c_int]
113 InitAvFormatContext = _lib.InitAvFormatContext
114 InitAvFormatContext.restype = POINTER(MediaFormatContext_t)
115 InitAvFormatContext.argtypes = [c_char_p]
117 FreeAvFormatContext = _lib.FreeAvFormatContext
118 FreeAvFormatContext.restype = None
119 FreeAvFormatContext.argtypes = [POINTER(MediaFormatContext_t)]
122 ReadNextPacket = _lib.ReadNextPacket
123 ReadNextPacket.restype = POINTER(MediaPacket_t)
124 ReadNextPacket.argtypes = [POINTER(MediaFormatContext_t)]
127 ReadReset = _lib.ReadReset
128 ReadReset.restype = None
129 ReadReset.argtypes = [POINTER(MediaFormatContext_t)]
130 
131 SeekToTime = _lib.SeekToTime
132 SeekToTime.restype = c_int
133 SeekToTime.argtypes = [POINTER(MediaFormatContext_t),c_int]
134 
135 FlushBuffer = _lib.FlushBuffer
136 FlushBuffer.restype =None
137 FlushBuffer.argtypes = [POINTER(MediaCodecContext_t)]
138 
139 InitLib = _lib.InitLib
140 InitLib.restype =None
141 InitLib.argtypes = []
142 
143 Cleanup = _lib.Cleanup
144 Cleanup.restype =None
145 Cleanup.argtypes = []

好了,看看如何使用這些接口 
視頻文件播放:      http://sw2us.com/static/projects/py-ffmpeg/test_qt.py
posted on 2014-04-14 22:35 放屁阿狗 閱讀(5879) 評論(2)  編輯 收藏 引用

Feedback

# re: py-ffmpeg在python中利用ctype包裝的ffmpeg以提供流控制 2014-04-14 22:37 春秋十二月
如果要做好文檔,能完整闡述清楚自己的構思、想法和邏輯結構,這比較難
--我非常認同這句話,作為一個真正的程序員,不僅要會寫程序,還要會寫文檔,缺一不可。  回復  更多評論
  

# re: py-ffmpeg在python中利用ctype包裝ffmpeg 2014-04-14 23:31 放屁阿狗
首先是心態,不要讓自己毛躁起來,還有就是環境,畢竟在國內,急功近利是一種普遍的病態  回復  更多評論
  


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产午夜精品全部视频在线播放| 狠狠色狠色综合曰曰| 一本大道久久a久久综合婷婷 | 国产亚洲欧美色| 久久国产精品久久久久久电车| 亚洲图片在线观看| 国产精品高潮呻吟视频| 亚洲欧美日韩国产一区二区三区| 在线一区亚洲| 国产亚洲欧美日韩一区二区| 欧美91大片| 欧美国产大片| 午夜一级久久| 久久综合网络一区二区| 亚洲视频在线观看网站| 亚洲免费视频观看| 亚洲国产精品嫩草影院| 亚洲美女精品成人在线视频| 国产精品免费区二区三区观看| 久久精品视频在线播放| 蜜桃伊人久久| 欧美一区三区二区在线观看| 久久网站免费| 亚洲一区二区三区免费视频| 亚洲男人第一网站| 亚洲国产精品一区在线观看不卡 | 亚洲女性喷水在线观看一区| 国产一区二区三区视频在线观看| 欧美成人午夜视频| 国产精品美女久久久免费| 久久亚洲综合网| 欧美日韩在线观看一区二区三区| 久久青青草原一区二区| 欧美精品一区二区三区一线天视频| 欧美一区二区三区免费视| 欧美77777| 久久大香伊蕉在人线观看热2| 另类国产ts人妖高潮视频| 亚洲欧美在线免费| 欧美91精品| 久久精品国产亚洲一区二区三区| 欧美美女操人视频| 免费在线成人av| 国产精品日韩久久久久| 亚洲精品久久久久中文字幕欢迎你| 国产日韩欧美不卡| 亚洲精品国精品久久99热| 激情欧美国产欧美| 亚洲欧美日韩中文播放| 亚洲视频日本| 欧美高清日韩| 亚洲丁香婷深爱综合| 一区二区亚洲精品国产| 亚洲欧美国内爽妇网| 亚洲一区二区三区在线观看视频| 欧美jizz19性欧美| 久久综合五月天婷婷伊人| 国产欧美日韩视频一区二区| 一区二区三区四区五区视频| 一本久道久久久| 欧美大尺度在线观看| 欧美成人日韩| 亚洲人成绝费网站色www| 欧美在线资源| 久久天堂av综合合色| 国产区精品视频| 午夜视频久久久久久| 欧美一级日韩一级| 国产欧美一区二区精品秋霞影院| 在线中文字幕日韩| 欧美一区二区免费| 国产欧美丝祙| 久久九九国产精品| 能在线观看的日韩av| 亚洲国产成人久久综合一区| 久久久久九九九九| 欧美激情女人20p| 亚洲日本欧美| 欧美区国产区| 亚洲一级在线观看| 久久国产精品亚洲va麻豆| 国内精品模特av私拍在线观看| 久久成年人视频| 老司机免费视频久久| 最新日韩在线| 欧美日韩精品免费观看视频| 亚洲婷婷在线| 久久亚洲私人国产精品va| 亚洲国产专区校园欧美| 欧美日韩国产高清视频| 亚洲女爱视频在线| 欧美成va人片在线观看| 一区二区三区国产精华| 国产欧美日韩伦理| 麻豆精品在线观看| 亚洲网在线观看| 久久深夜福利| 一区二区三区成人精品| 国产亚洲毛片| 欧美精品在线网站| 欧美一区二区三区视频在线| 欧美成人黄色小视频| 亚洲在线观看视频| 亚洲电影在线| 国产精品啊啊啊| 久久先锋资源| 亚洲天堂免费在线观看视频| 免费观看在线综合色| 亚洲女人小视频在线观看| 一色屋精品视频在线观看网站| 欧美日韩国产精品一区| 久久精品1区| 亚洲午夜一区二区三区| 亚洲国产精品电影在线观看| 欧美一区二区在线| 国产精品99久久久久久久久| 激情成人综合| 国产精品久久国产三级国电话系列| 久久中文精品| 先锋亚洲精品| 一区二区三区高清| 亚洲激情一区二区三区| 久热精品在线| 欧美在线日韩精品| 亚洲午夜在线观看| 日韩一级网站| 亚洲欧洲一区二区三区久久| 国产欧美一区二区三区在线看蜜臀 | 亚洲视频一区二区| 欧美激情在线观看| 玖玖玖国产精品| 香蕉免费一区二区三区在线观看| 亚洲免费精品| 亚洲人成网站在线观看播放| 狠狠狠色丁香婷婷综合激情| 国产精品网站在线观看| 欧美性jizz18性欧美| 欧美日韩国产小视频在线观看| 狂野欧美一区| 狼狼综合久久久久综合网| 久久久99免费视频| 久久精品国产综合精品| 欧美亚洲在线观看| 午夜精品免费在线| 欧美一级片在线播放| 欧美一级淫片播放口| 午夜亚洲视频| 欧美在线首页| 久久久久久夜| 农夫在线精品视频免费观看| 免费成人黄色| 欧美激情视频在线免费观看 欧美视频免费一 | 亚洲尤物影院| 午夜欧美电影在线观看| 欧美一级在线亚洲天堂| 性欧美8khd高清极品| 欧美一区二区网站| 开心色5月久久精品| 久久伊人精品天天| 欧美黑人在线观看| 亚洲人成绝费网站色www| 亚洲人成网站777色婷婷| 日韩视频―中文字幕| 亚洲一区观看| 久久手机精品视频| 欧美mv日韩mv亚洲| 欧美日韩综合久久| 国产一区二区三区直播精品电影| 黄色亚洲免费| 亚洲精品欧美| 欧美一级二级三级蜜桃| 两个人的视频www国产精品| 亚洲破处大片| 亚洲一区三区视频在线观看| 久久精品国产欧美激情| 欧美精品v国产精品v日韩精品| 国产精品福利网| 韩国一区二区在线观看| 一本色道婷婷久久欧美| 欧美一区视频| 亚洲激情网站| 欧美在线视频免费| 欧美日韩国产专区| 国产偷国产偷亚洲高清97cao| 亚洲国产日日夜夜| 亚洲欧美韩国| 亚洲国产精品久久久久久女王| 亚洲视频高清| 免费人成精品欧美精品| 国产精品欧美久久| 亚洲精品1区2区| 久久精品99久久香蕉国产色戒| 欧美国产精品久久| 亚洲欧美日本在线| 欧美日韩麻豆| 在线观看日韩av电影| 午夜精品久久久久久99热| 亚洲国产欧美在线人成| 久久精品二区| 国产欧美日韩高清|