使用ffmpeg生成视频

2023-12-02

我正在尝试使用 ffmpeg 库从图像集生成视频。使用以下代码,我可以在模拟器上生成视频,但是当我在设备上运行它时,它会在视频中产生奇怪的绿色效果。我跟着使用 ffmpeg 将图像编码为视频网址。任何人都可以帮助我,或者如果可以提供代码片段,将不胜感激。

//这是代码..

(void)createVideoFromImages 
{
  NSString *fileName2 = [Utilities documentsPath:[NSString stringWithFormat:@"test.mov"]];
  NSLog(@"filename: %@",fileName2);

  //Register all formats and codecs

  AVCodec *codec;

  //avcodec_register_all();
  //avdevice_register_all();

  av_register_all();


  AVCodecContext *c= NULL; 
  int i, out_size, size, outbuf_size;
  FILE *f;
  AVFrame *picture;
  uint8_t *outbuf;

  printf("Video encoding\n");

  /* find the mpeg video encoder */
  codec = avcodec_find_encoder(CODEC_ID_MPEG2VIDEO);
  if (!codec) 
  {
    fprintf(stderr, "codec not found\n");
    exit(1);
  }

  c= avcodec_alloc_context();
  picture= avcodec_alloc_frame();

  /* put sample parameters */
  c->bit_rate = 400000;
  /* resolution must be a multiple of two */
  c->width = 256;
  c->height = 256;//258;

  /* frames per second */
  c->time_base= (AVRational){1,25};
  c->gop_size = 10; /* emit one intra frame every ten frames */
  c->max_b_frames=1;
  c->pix_fmt =  PIX_FMT_YUV420P;//PIX_FMT_YUV420P;

  /* open it */
  if (avcodec_open(c, codec) < 0) {
    fprintf(stderr, "could not open codec\n");
    exit(1);
  }

  const char* filename_cstr = [fileName2 cStringUsingEncoding:NSUTF8StringEncoding];
  f = fopen(filename_cstr, "wb");
  if (!f) {
    fprintf(stderr, "could not open %s\n", fileName2);
    exit(1);
  }

  /* alloc image and output buffer */
  outbuf_size = 100000;
  outbuf = malloc(outbuf_size);
  size = c->width * c->height;

  #pragma mark -
  AVFrame* outpic = avcodec_alloc_frame();
  int nbytes = avpicture_get_size(PIX_FMT_YUV420P, c->width, c->height);

  NSLog(@"bytes: %d",nbytes);

  //create buffer for the output image
  uint8_t* outbuffer = (uint8_t*)av_malloc(nbytes);

  for(i=100;i<104;i++) 
  {
    fflush(stdout);

    int numBytes = avpicture_get_size(PIX_FMT_YUV420P, c->width, c->height);
    NSLog(@"numBytes: %d",numBytes);
    uint8_t *buffer = (uint8_t *)av_malloc(numBytes*sizeof(uint8_t));

    UIImage *image;

    image = [UIImage imageWithContentsOfFile:[Utilities bundlePath:[NSString stringWithFormat:@"%d.png",i]]];


    /*
    if(i>=98)//for video images
    {
       NSLog(@"i: %d",i);
       image = [UIImage imageWithContentsOfFile:[Utilities documentsPath:[NSString stringWithFormat:@"image0098.png"]]]; ///@"image0098.png"]];
       //[NSString stringWithFormat:@"%d.png", i]];
    }
    else //for custom image
    {
       image = [UIImage imageWithContentsOfFile:[Utilities bundlePath:[NSString stringWithFormat:@"image%04d.png", i]]];
       //[UIImage imageNamed:[NSString stringWithFormat:@"%d.png", i]];//@"image%04d.png",i]];
    }*/

    CGImageRef newCgImage = [image CGImage];

    NSLog(@"No. of Bits per component: %d",CGImageGetBitsPerComponent([image CGImage]));
    NSLog(@"No. of Bits per pixel: %d",CGImageGetBitsPerPixel([image CGImage]));
    NSLog(@"No. of Bytes per row: %d",CGImageGetBytesPerRow([image CGImage]));


    CGDataProviderRef dataProvider = CGImageGetDataProvider(newCgImage);
    CFDataRef bitmapData = CGDataProviderCopyData(dataProvider);
    buffer = (uint8_t *)CFDataGetBytePtr(bitmapData);   

    struct SwsContext* fooContext;

    avpicture_fill((AVPicture*)picture, buffer, PIX_FMT_RGBA, c->width, c->height);

    avpicture_fill((AVPicture*)outpic, outbuffer, PIX_FMT_YUV420P, c->width, c->height);

    fooContext= sws_getContext(c->width, c->height, 
       PIX_FMT_RGBA, 
        c->width, c->height, 
        PIX_FMT_YUV420P, 
        SWS_FAST_BILINEAR , NULL, NULL, NULL);

//}

  //perform the conversion

  NSLog(@"linesize: %d", picture->linesize[0]);

  sws_scale(fooContext, picture->data, picture->linesize, 0, c->height, outpic->data, outpic->linesize);

  // Here is where I try to convert to YUV

  /* encode the image */
  out_size = avcodec_encode_video(c, outbuf, outbuf_size, outpic);
  printf("encoding frame %d (size=%d)\n", i, out_size);
  fwrite(outbuf, 1, out_size, f);

  NSLog(@"%d",sizeof(f));

  free(buffer);
  buffer = NULL;      

  }

  /* get the delayed frames */
  for( ; out_size; i++) 
  {
    fflush(stdout);
    out_size = avcodec_encode_video(c, outbuf, outbuf_size, NULL);
    printf("write frame %3d (size=%5d)\n", i, out_size);
    fwrite(outbuf, 1, outbuf_size, f);      
  }

  /* add sequence end code to have a real mpeg file */
  outbuf[0] = 0x00;
  outbuf[1] = 0x00;
  outbuf[2] = 0x01;
  outbuf[3] = 0xb7;
  fwrite(outbuf, 1, 4, f);

  fclose(f);
  free(outbuf);

  avcodec_close(c);
  av_free(c);
  av_free(picture);
  printf("\n");

}

None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用ffmpeg生成视频 的相关文章

  • 流媒体视频文件?

    我需要流式传输 flv 文件 流媒体应该看起来像直播 我应该有一种方法可以更改目标文件 抱歉我的英语不好 如果 流式传输 的意思是 显示 Flash 视频剪辑 则 flv streaming 并不是真正的流式传输 而是正常的文件传输 即使文
  • Google Cloud Platform:将上传的 MP4 文件转换为 HLS 文件

    我正在构建一个平台 允许用户将一些视频文件 20 40 秒 从手机上传到服务器 所有这些上传目前都运行良好 文件通过nodejs云功能存储在谷歌存储桶中 现在我想创建一个 gcp 转码器作业 它将上传的 mp4 视频文件转换为 hls 视频
  • Android 中如何获取帧

    实际上 我需要从视频中获取所有帧 但在使用 Mediametadataretriever 缩略图 时间戳获取帧时 我经常重复获取第一帧 然后获取特定时间帧 我通过更改所有 GetFrameAtTime options 尝试了很多修复 但仍然
  • 重新采样 H264 视频以降低帧速率,同时保持高图像质量

    以下是感兴趣的视频的 mplayer 输出 br carina tmp mplayer foo mov mplayer Symbol ff codec bmp tags has different size in shared object
  • 如何在 Jekyll 博客中包含视频标签/mp4 视频

    I am not寻找一种方法链接到 YouTube https stackoverflow com questions 10529859 how to include video in jekyll markdown blog 122738
  • FFmpeg 不适用于 android 10,直接进入 onFailure(String message) 并显示空消息

    我在我的一个项目中使用 FFmpeg 进行视频压缩 在 Android 10 Google Pixel 3a 上 对于发送执行的任何命令 它会直接进入 onFailure String message 并显示空消息 所以我在我的应用程序 g
  • 如何使用javascript将视频文件转换为字符串?

    我在 signalR 工作 我想通过将视频文件拆分为不同部分来将视频文件从一个客户端发送到另一个客户端 我已经通过分割图像源数据发送图像并在另一个客户端上接收该图像 document getElementById fileUpload ad
  • VideoCamera 获取支持的分辨率

    我使用 DirectShow 库 DirectShowLib 2005 dll 和 C 来捕获摄像机图像 当我定义捕获对象的大小时 我有以下参数 const int VIDEOWIDTH 640 Depends on video devic
  • 适用于 iPhone 和 HTTP 直播的实时视频聊天

    所以一般来说 我想为 iPhone 制作一个具有视频聊天功能的应用程序 但经过多次搜索 我仍然找不到任何成功的结果 是否有任何公共或私有 API 可用于在 iPhone 上执行此操作 如果您的答案是 是 请帮助我 基本上 我想要的是读取连接
  • ffmpeg:音频样本的字节顺序

    我使用 ffmpeg 的 avcodec 从我的 C 应用程序中的音乐文件中检索原始音频样本 对于我测试的文件 这些文件样本的字节序似乎是小字节序 但我想知道对于我尝试解码的所有文件是否总是如此 即来自 ffmpeg 的实现或至少它的体系结
  • OpenCV IP 相机应用程序崩溃 [h264 @ 0xxxxx] 访问单元中缺少图片

    我在 cpp 中有一个 opencv 应用程序 它使用 opencv 的简单结构捕获视频流并将其保存到视频文件中 它与我的网络摄像头完美配合 但是 当我运行它从 IP 摄像机捕获流时 它可能会在大约十秒后崩溃 我的编译命令是 g O3 IP
  • 如何使用 ffmpeg 将两个视频/音频流混合为一个

    我有两个视频 v1 flv 和 v2 flv 想要创建 v3 flv 其中包含来自 v1 flv 的视频流以及来自 v1 flv 和 v2 flv 的 混合 音频流 使用 ffmpeg 命令可以实现类似的操作吗 谢谢 我认为使用 ffmpe
  • HTML5 视频:使用 Blob URL 流式传输视频

    我有一个 Blob 数组 实际上是二进制数据 我可以表达它 但是效率最高 我现在正在使用 Blob 但也许Uint8Array或者有什么会更好 每个 Blob 包含 1 秒的音频 视频数据 每秒都会生成一个新的 Blob 并将其附加到我的数
  • FFmpeg - 来自 NodeJS 的 RTMP 流,流比实时更快

    我的目标是在 Node 中渲染画布 并将该画布流式传输到 RTMP 服务器 最终是 Twitch 但现在我正在在本地 RTMP 服务器上测试 流式传输到 RTMP 的标准方式似乎是ffmpeg 所以我使用它 从 NodeJS 中作为子进程生
  • 使用 Vlc DotNet 库显示视频

    我在 Visual Studio 2012 中制作了一个 C Windows 窗体应用程序 并从该网页添加了 dll http vlcdotnet codeplex com http vlcdotnet codeplex com 我已经获得
  • 了解 JavaScript - 资源

    使用 StackOverflow 的微型 Digit Blog 功能进行描述here https stackoverflow com about 我想发布以下我刚刚看到的 我觉得很有趣的谷歌技术谈话视频 我一直在理解 javascript
  • 同时从多个流中捕获、最佳方法以及如何减少 CPU 使用率

    我目前正在编写一个应用程序 该应用程序将捕获大量 RTSP 流 在我的例子中为 12 个 并将其显示在 QT 小部件上 当我超过大约 6 7 个流时 问题就会出现 CPU 使用率激增并且出现明显的卡顿 我认为它不是 QT 绘制函数的原因是因
  • OpenCV VideoWriter 未写入 Output.avi

    我正在尝试编写一段简单的代码来获取视频 裁剪视频并写入输出文件 系统设置 OS Windows 10 Conda Environment Python Version 3 7 OpenCV Version 3 4 2 ffmpeg Vers
  • 如何从任何网站下载视频

    我只是想知道如何从任何网站下载视频的总体思路 我尝试的事情 我检查页面 在视频属性标记中看到 blob URL 将 blob URL 复制粘贴到浏览器中 但无法打开 I also look around the Developer tool
  • 不使用控件时,视频元素在 Chrome 中消失

    So I think这是一个浏览器错误 它出现在一个更复杂的设计 网站中 但我已经进行了很好的尝试 简化了我的代码和设计等 并发现了以下内容 嵌入时

随机推荐

  • 在 Inno Setup 中使用 rundll32 或 dpinst 安装驱动程序?

    我正在尝试使用 Inno Setup 安装驱动程序 看起来有 至少 两种方法可以做到这一点 dpinst exe或运行rundll反对这 inf file 我知道有两个不同版本的 DPinst 适用于 x86 和 x64 根据操作系统的不同
  • 范围生成中“..”(双点)和“...”(三点)之间的区别?

    我刚刚开始学习 Ruby 和 Ruby on Rails 遇到了使用范围的验证代码 validates inclusion of age in gt 21 99 validates exclusion of age in gt 0 21 m
  • C++ 在什么条件下优化构造函数调用?

    我正在为矩阵算术编写一个类 我正在实现的一个功能是您可以 切片 一个矩阵并返回另一个矩阵 但这样做是为了使返回的矩阵引用父级的内存 如果您想要获取矩阵的一部分或将向量添加到列或类似的事情 这非常有用 但是 我想实现它 以便如果分配或复制返回
  • 为矩阵的每一行设置特定列的值

    我有一个矩阵A with m行 我想将每行的特定元素设置为 1 列索引因行而异 由列向量指定a with m值 也就是说 我想要A i a i 1 有没有一种快速的方法可以在Matlab中做到这一点 没有for循环 我用以下方法解决了这个问
  • Python urllib2.open 连接被对等错误重置

    我正在尝试使用 python 抓取页面 问题是 我不断收到 Errno54 连接被同行重置 当我运行此代码时出现错误 urllib2 urlopen http www bkstr com webapp wcs stores servlet
  • 计算两个经纬度点之间的距离? (半正矢公式)

    如何计算由纬度和经度指定的两点之间的距离 为了澄清起见 我想要以公里为单位的距离 这些点使用 WGS84 系统 我想了解可用方法的相对精度 This link可能对您有帮助 因为它详细介绍了半正矢公式来计算距离 Excerpt 该脚本 Ja
  • SQL Server 表填充源

    我有一个审计数据库 由其他人创建 有些东西正在用表大小数据填充它 这很有意义 因为它是审计数据库 SQL 服务器有太多的工作 我想知道审计表中填充了什么 有没有像 sys comments 之类的东西 它可以告诉我什么正在填充表 或者我是否
  • Google App Script 背景通过 HtmlService 透明

    我正在为 google 网站使用 google apps 脚本 并且我可以使用以下命令轻松创建透明背景UiApp createApplication setStyleAttribute background transparent 现在 我
  • 将 NuGet 包替换为本地 dll 文件

    我正在开发的项目依赖于 NuGet 包 包内的dll文件是在Release模式下编译的 因此使用调试器检查代码 这是我的目标 是不可能的 我想用我在调试模式下编译的文件替换 dll 文件 如果我通过 NuGet 删除包然后通过添加它Add
  • Paradox 如何管理 null 值和空值?

    我通过 Borland 数据库引擎 BDE 使用 Paradox 表 我无法领悟道路null and 空字符串值在字符串字段中处理 Paradox 数据类型 A 我的具体问题是如何确定字段值是否为空或空字符串 在数据库桌面工具中 它们似乎都
  • 如何在 Python 3 pyspark 中反转 RDD 中的键和值?

    这在 Python 2 7 中有效 但在 Python 3 5 中它返回 语法错误 语法无效 我不确定这是否与我在另一篇文章中读到的 元组解包 从 Python 3 中删除这一事实有关 或者是一个不同的问题 rddInverted rdd
  • MATLAB 的“fminsearch”与 Octave 的“fmincg”不同

    我试图在 MATLAB 和 Octave 中的两个函数之间获得简单优化问题的一致答案 这是我的代码 options optimset MaxIter 500 Display iter MaxFunEvals 1000 objFunc t l
  • Java 静态调用比非静态调用更昂贵还是更便宜?

    是否有这样或那样的性能优势 它是编译器 VM 特定的吗 我正在使用热点 四年后 好吧 为了一劳永逸地解决这个问题 我编写了一个基准测试 它显示了不同类型的调用 虚拟 非虚拟 静态 之间的比较 我运行了它关于ideone 这就是我得到的 迭代
  • 覆盖性。配置为忽略源代码的某些部分

    寻找一种配置覆盖性以忽略某些代码部分的方法 例如 假设我有源代码func1 and func2 我不想进行覆盖性分析func1 但我还是想分析一下func2 有没有办法做到这一点 是否有我可以添加的特殊内嵌注释 int func1 int
  • 创建包含“;”的cookie特点

    我想创建一个cookie 它的值包含许多 通常用于在 java 中分隔多个 cookie 的字符 这就是为什么我的代码无法完成他的工作 如果有人可以帮助我如何创建这个 特殊 cookie 并使我的代码正常工作 谢谢 您可以使用 URL 编码
  • 如何为多记录 Rails 表单中的复选框设置唯一 ID?

    我大致按照中的说明设置了一个 Rails 表单this铁路广播 这是表单的代码 ul div div ul 这是待办事项部分的代码 div class todo li li div
  • Vue:如何使用@click调用多个函数?

    如何在一个函数中调用多个函数 click aka v on click 到目前为止我尝试过 用分号分隔函数 div div 使用几个 click div div 作为解决方法 我可以创建一个处理程序 div div function fn3
  • QSignalMapper 可以用来重新发出具有多个参数的信号吗?

    是否可以使用 QSignalMapper 重新发出具有多个参数的信号 我找到了一种解决方法 但我很想知道这是否可能 示例 采取void QLineEdit textEdited const QString text 信号 并重新发出 voi
  • 我的 sql 查询使用 GROUP BY 函数获取中间行值

    我的数据库结构是这样的 Id Price Code 1 0 12 93 2 0 13 93 3 0 54 93 4 0 96 93 5 0 10 94 6 0 30 94 7 0 90 94 8 1 40 94 9 2 30 94 我必须使
  • 使用ffmpeg生成视频

    我正在尝试使用 ffmpeg 库从图像集生成视频 使用以下代码 我可以在模拟器上生成视频 但是当我在设备上运行它时 它会在视频中产生奇怪的绿色效果 我跟着使用 ffmpeg 将图像编码为视频网址 任何人都可以帮助我 或者如果可以提供代码片段