目前项目里有一需求,需要用php动态替换flash中图片(因为是flash lite 1.1,所以不能在flash中替换),思路是先将flash读取成2进制流,然后将其中的图片信息替换掉,替换后直接在页面输出,显示新的flash。现在的问题是php对2进制流操作的支持非常弱,请问各位大侠这个有没可能实现?以下是c的实现
int main(int argc, char **argv) {
  char *program_name = argv[0];
  swf_file_t *swf_file;
  swf_block_t *block;
  struct stat filestat;
  long jpeg_size;
  unsigned char *data;
  FILE *fp;
  if (argc != 4) {
    usage(program_name);
    return EXIT_FAILURE;
  }
  char *file_name = argv[1];
  int jpeg_id = atoi(argv[2]);
  char *jpeg_file = argv[3];
  swf_file = load_swf_file(file_name);
  if (! swf_file) {
    usage(program_name);
    fprintf(stderr, "Can't load swf file\n");
    return EXIT_FAILURE;
  }  printf("search jpeg id\n");
  for(block = swf_file->block; block; block = block->next) {
    if (block->tag == 6) { // DefineBitsJPEG
      data = block->body;
      int id = LE_VALUE_2BYTE(data);
      printf("id=0x%x\n", id);
      if (id == jpeg_id) {
        break;
      }
    }
  }
  if (! block) {
    fprintf(stderr, "not found such jpeg id(%d)", jpeg_id);
    exit (1);
  }
  /* replace jpeg file */  if(stat(jpeg_file, &filestat)) {
    perror("stat jpegfile");
    exit(1);
  }
  jpeg_size = filestat.st_size;
  fp = fopen(jpeg_file, "rb");
  if (! fp) {
    perror("open jpegfile");
    exit(1);
  }
  data = calloc(2 + jpeg_size, 1);
  LE_BYTES_USHORT(data, jpeg_id);
  fread(data + 2, jpeg_size, 1, fp);
  fclose(fp);
  block->length = jpeg_size;
  free(block->body);
  block->body = data;
  /* output */
  save_swf_file("test.swf", swf_file);
  
  return EXIT_SUCCESS;
}

解决方案 »

  1.   

    直接readfile函数读取对象文件就可以了,没有那么复杂
    <?php
    // swf文件的MIME
    header('Content-type: application/x-shockwave-flash');// 输出给浏览器的swf文件名
    header('Content-Disposition: attachment; filename="target.swf"');// 需要显示的swf文件,可以动态添加
    readfile('target.swf');
    ?>
      

  2.   

    楼上的大概没明白我的意思,我的flash中有一贞是静态图片,我需要用php将flash中图片替换掉在输出。
      

  3.   

    楼上的大概没明白我的意思吧,我的flash中有一贞是静态图片,我需要用php将flash的图片替换掉啊。
      

  4.   

     与其这样,不如在flash上下功夫,让flash读取的图片是可配置的.
      

  5.   

    楼上的还是没看明白我的意思,因为是flash lite 1.1,语法只支持flash 4,而且还是在手机上用的,所以不能在flash中替换
    看来只能用swfmill了,效率低点也没办法了
      

  6.   


    很简单的问题,都被弄复杂了。替换图片的话,同理,只不过PHP输出图片就可以了。
      

  7.   

    php 是很强大的 
    直接翻译 c 语言代码为 php 代码即可
      

  8.   

    我有个问题就是 是否 FLASH 生成SWF文件后  SWF 播放器 没有对 SWF 文件的校验功能 换句话说就是 。只要把 二进制流中的 一段去掉。就是一定会去掉 flash 某一帧  (这个似乎是不可能的。) 既然不能去掉某一帧。那么 对于原帧内二进制的图片信息替换为 非相同长度二进制图片流时候 对于SWF 文件本身有没有影响?如果没有影响 那么 PHP 有简单的办法。 只要你能定位到 图片的起始和结束那么  读取 SWF -》 图片起始处 数据  +  新图片数据 + 旧图片终点处之后的 SWF 
    把上面的流输出到 SWF 即可
      

  9.   

    你的 C 程序中设计到了 load_swf_file 应该是加在SWF 并且按照SWF 结构对它进行重构(把二进制流还原成了 内存结构。)里面肯定是读取了 SWF 每帧的 数据 并且用数组存了。你如果要用PHP 做,是有可能的,可能需要把你C 代码 转换为 PHP 。
      

  10.   

    这个事实上是可以的,但问题是大多数情况下你修改后swf会变的不能使用。
    所以操作要非常小心,如果替换正确的话 对于原帧内二进制的图片信息替换为 非相同长度二进制图片流时候 swf还是可以正常显示的在 c里  load_swf_file 确实对它进行了重构,但不是对每帧。只是得到它的结构,比如哪一部分是图片之类的,图片类型什么的。
      

  11.   

    感谢大家的支持,特别感谢 CNCPT01 归根结底,php虽然是由c继承过来的,但php对二进制流的支持太弱了,只有个 pack和unpack可以用用。这个问题理论上是有可能用php实现的,但要去具体分析二进制流内容,太痛苦。所以决定还是用 sfwmill做吧,虽说效率低点,但总归还是可以实现的。
    (swfmill可以将flash转换成xml,我们再将其中的图片内容替换掉,然后再通过swfmill将xml转换成flash)