首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • FFDec——供Delphi使用的视频解码动态链接库 [无满意答案结帖,结帖人:cybercake]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cybercake
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 结帖率:
    发表于:2008-05-06 20:32:26 楼主
    FFmpeg 是一个非常强大的视频/音频编码解码库。但是很可惜,人们很难将其应用到非 C/C++ 的工程中。因此我一年前将其重新封装为一个库并希望这一工作能够简化其在视频解码方面的应用——尤其是在 Delphi (或 Free Pascal) 中的应用。

    FFDec 库由一个 DLL (有可能按照授权方式不同分为两个版本) 和一个负责动态装载 DLL 的 Pascal 头文件。用户可以直接将其加入到自己的工程中进行编译。

    您可以访问在 SF.net 上 FFDec 的官方主页来取得最新的信息:
    http://sourceforge.net/projects/ffdec/

    FFDec 几乎是直接对 FFmpeg 的原生 API 进行了转换封装。FFDec 的库函数在应用上也与 libAV* 函数十分接近。因此在使用 FFDec 之前,您有必要先了解一下 FFmpeg 的原理。此外抱歉的是,我近期内恐怕无法提供详细的 FFDec 的文档。不过您可以通过查看 DLL 源代码(它比你想象的要简单)以取得对 FFDec 工作原理的认知。

    依照集成的 FFmpeg 库的版本授权不同,FFDec 库分为 GPL 和 LGPL 版本。两个版本都可以按照统一的接口调用,只是 LGPL 版本所支持的文件格式要少一些。
    100  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • uglyquasimodo
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-08 19:58:291楼 得分:0
    支持一下,测试结果如下:
    program testffdec;

    {$APPTYPE CONSOLE}

    uses
      SysUtils, FFDecImport;

    var
      decoder : HFFDecoder;
      info : AVInfo;
      packet : PAVPacket;
      buffer : array [0..10000000] of Byte;
      size : Integer;
    begin
      decoder := ffOpenFile('E:\test.asf', info);
      packet := ffCreateAVPacket(True);
      try
        while ffRead(decoder, packet,
          FFDEC_RAW_FRAME_TYPE_ANY) do
        begin
          if packet.stream_index
            = info.audioStreamIndex then
          begin
            if ffDecode(decoder, packet,
              @(buffer[0]), Length(buffer), size) then
            // Play the decoded audio samples ...
              WriteLn('audio: ', size);
          end
          else if packet.stream_index
            = info.videoStreamIndex then
          begin
            if ffDecode(decoder, packet,
              @(buffer[0]), Length(buffer), size) then
            // Show the decoded
            // picture (BGR24 format) ...
              WriteLn('video: ', size);
          end;
          Sleep(100);
        end;
      finally
        ffFreeAVPacket(packet);
        ffClose(decoder);
      end;
    end.

    输出:
    audio: 32768
    video: 10000001
    audio: 32768
    audio: 32768
    video: 10000001
    video: 10000001
    audio: 24576
    video: 10000001
    video: 10000001
    video: 10000001
    ......

    好像视频没有解码出来,会是什么原因呢?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cybercake
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-09 21:01:092楼 得分:0
    如果ffDecode返回为True的话,那么说明解码应该已经成功了。你可以查看一下缓冲区中的内容。
    不过这个size参数确实是应该返回实际需要的缓冲区大小值的,我会在正式发布版中更正这个问题:)

    P.S. 哪位好心给我一个共享软件联盟论坛的邀请码-___-|||
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cybercake
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-09 21:06:263楼 得分:0
    ffDec的视频部分我并没有完全测试过,哪位发现有问题可以在这个帖子或者SF的官方论坛提出。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • uglyquasimodo
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-12 13:36:344楼 得分:0
    建议你用delphi+ffDec改写ffmpeg、ffplay作为demo
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • uglyquasimodo
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-12 13:38:305楼 得分:0
    另外,你这个库依赖pthreadGC2.dll,应该是不用依赖的
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cybercake
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-13 03:06:226楼 得分:0
    谢谢你的建议!确实pthread并不是必须的库,但对于某些编码器仍然是需要的。

    具体的原因请看这里:http://arrozcru.no-ip.org/ffmpeg_wiki/tiki-index.php?page=pthreads

    ffdec在没有pthread.dll的前提下同样可以使用(其实我发布ffdec相关软件的时候从来没有发布过pthread.dll)。

    至于改写ffmpeg等就有些困难了。首先ffdec不是ffmpeg的delphi版,它在设计的时候就确定只是用来解码的(当然以后有可能支持编码)。至于说到写一个Delphi版的播放器……照说我迟早会写这么个东西的,只是现下是在没有闲暇,所以只好厚颜请大家等待了。

    在播放器面试之前,大家还是看我给出的那个例子吧。毕竟真正的播放器还涉及到其他的很多东西,比如数据缓存等……也许并不是像大家想象的那么简单。如果需要的人多的话,我或许会对FFdec作一次更高层的封装。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • uglyquasimodo
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-13 10:51:397楼 得分:0
    现在关键是如果没有pthreadGC2.dll,你这个库加载不起来啊,还有MSVCR80.dll,可能你的开发环境有这些库所以没问题。就像我的开发环境中有MSVCR80.dll所以只提示找不到pthreadGC2.dll(后来我去下了一个)。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • shuihan20e
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-13 11:08:498楼 得分:0
    我可以邀请你,不过,多给我点分吧
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • uglyquasimodo
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-13 11:09:299楼 得分:0
    现在不用提供一个很完善的播放器,提供一个demo就可以了,ffplay也就是这么个东西嘛,相信有这么个小demo,会引起更多人的兴趣。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cybercake
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-16 01:18:0010楼 得分:0
    to shuihan20e:我已经给帖子加了分,嫩可以PM我了。

    to uglyquasimodo:
    嗯,例子会在下个版本发布时加进去的。
    至于pthreadGC2.dll,你可以在这个页面下载到:http://arrozcru.no-ip.org/ffmpeg_builds/,往下翻一下就是10461版,你随便下载一个sdk包里头应该都有这个文件的:)
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • gyk120
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 2

    发表于:2008-05-18 17:30:4311楼 得分:0
    多谢楼主提供,晚上试试
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • 3cs
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-20 18:17:3912楼 得分:0
    我也来试试
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xiesongwu126com
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-20 18:38:3313楼 得分:0
    沒搞過媒體編程啊,就路過下.......
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • dd_zhouqian
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-06-17 17:59:3914楼 得分:0
    帮顶,有空在来谈一下
    修改 删除 举报 引用 回复