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 版本所支持的文件格式要少一些。

解决方案 »

  1.   

    支持一下,测试结果如下:
    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
    ......好像视频没有解码出来,会是什么原因呢?
      

  2.   

    如果ffDecode返回为True的话,那么说明解码应该已经成功了。你可以查看一下缓冲区中的内容。
    不过这个size参数确实是应该返回实际需要的缓冲区大小值的,我会在正式发布版中更正这个问题:)P.S. 哪位好心给我一个共享软件联盟论坛的邀请码-___-|||
      

  3.   

    ffDec的视频部分我并没有完全测试过,哪位发现有问题可以在这个帖子或者SF的官方论坛提出。
      

  4.   

    建议你用delphi+ffDec改写ffmpeg、ffplay作为demo
      

  5.   

    另外,你这个库依赖pthreadGC2.dll,应该是不用依赖的
      

  6.   

    谢谢你的建议!确实pthread并不是必须的库,但对于某些编码器仍然是需要的。具体的原因请看这里:http://arrozcru.no-ip.org/ffmpeg_wiki/tiki-index.php?page=pthreadsffdec在没有pthread.dll的前提下同样可以使用(其实我发布ffdec相关软件的时候从来没有发布过pthread.dll)。至于改写ffmpeg等就有些困难了。首先ffdec不是ffmpeg的delphi版,它在设计的时候就确定只是用来解码的(当然以后有可能支持编码)。至于说到写一个Delphi版的播放器……照说我迟早会写这么个东西的,只是现下是在没有闲暇,所以只好厚颜请大家等待了。在播放器面试之前,大家还是看我给出的那个例子吧。毕竟真正的播放器还涉及到其他的很多东西,比如数据缓存等……也许并不是像大家想象的那么简单。如果需要的人多的话,我或许会对FFdec作一次更高层的封装。
      

  7.   

    现在关键是如果没有pthreadGC2.dll,你这个库加载不起来啊,还有MSVCR80.dll,可能你的开发环境有这些库所以没问题。就像我的开发环境中有MSVCR80.dll所以只提示找不到pthreadGC2.dll(后来我去下了一个)。
      

  8.   

    现在不用提供一个很完善的播放器,提供一个demo就可以了,ffplay也就是这么个东西嘛,相信有这么个小demo,会引起更多人的兴趣。
      

  9.   

    to shuihan20e:我已经给帖子加了分,嫩可以PM我了。to uglyquasimodo:
    嗯,例子会在下个版本发布时加进去的。
    至于pthreadGC2.dll,你可以在这个页面下载到:http://arrozcru.no-ip.org/ffmpeg_builds/,往下翻一下就是10461版,你随便下载一个sdk包里头应该都有这个文件的:)