Github

https://github.com/gongluck/FFmpeg4.0-study/tree/master/Cff

CSws.h

  1. /*******************************************************************
  2. * Copyright(c) 2019
  3. * All rights reserved.
  4. *
  5. * 文件名称: CSws.h
  6. * 简要描述: 帧转换
  7. *
  8. * 作者: gongluck
  9. * 说明:
  10. *
  11. *******************************************************************/
  12. #ifndef __CSWS_H__
  13. #define __CSWS_H__
  14. #ifdef __cplusplus
  15. extern "C"
  16. {
  17. #endif
  18. #include <libswscale/swscale.h>
  19. #include <libavutil/imgutils.h> // av_image_alloc
  20. #ifdef __cplusplus
  21. }
  22. #endif
  23. #include <string>
  24. #include <mutex>
  25. class CSws
  26. {
  27. public:
  28. virtual ~CSws();
  29. // 状态
  30. enum STATUS { STOP, LOCKED };
  31. // 设置源参数
  32. bool set_src_opt(AVPixelFormat pixfmt, int w, int h, std::string& err);
  33. // 设置目标参数
  34. bool set_dst_opt(AVPixelFormat pixfmt, int w, int h, std::string& err);
  35. // 锁定设置
  36. bool lock_opt(std::string& err);
  37. // 解除锁定
  38. bool unlock_opt(std::string& err);
  39. // 转换
  40. int scale(const uint8_t* const srcSlice[], const int srcStride[], int srcSliceY, int srcSliceH, uint8_t* const dst[], const int dstStride[], std::string& err);
  41. private:
  42. STATUS status_ = STOP;
  43. std::recursive_mutex mutex_;
  44. SwsContext* swsctx_ = nullptr;
  45. AVPixelFormat src_pix_fmt_ = AV_PIX_FMT_NONE;
  46. AVPixelFormat dst_pix_fmt_ = AV_PIX_FMT_NONE;
  47. int src_w_ = 0;
  48. int src_h_ = 0;
  49. int dst_w_ = 0;
  50. int dst_h_ = 0;
  51. };
  52. #endif//__CSWS_H__

CSws.cpp

  1. /*******************************************************************
  2. * Copyright(c) 2019
  3. * All rights reserved.
  4. *
  5. * 文件名称: CSws.cpp
  6. * 简要描述: 帧转换
  7. *
  8. * 作者: gongluck
  9. * 说明:
  10. *
  11. *******************************************************************/
  12. #include "common.h"
  13. #include "CSws.h"
  14. CSws::~CSws()
  15. {
  16. std::string err;
  17. unlock_opt(err);
  18. }
  19. bool CSws::set_src_opt(AVPixelFormat pixfmt, int w, int h, std::string& err)
  20. {
  21. LOCK();
  22. CHECKSTOP(err);
  23. err = "opt succeed.";
  24. src_pix_fmt_ = pixfmt;
  25. src_w_ = w;
  26. src_h_ = h;
  27. return true;
  28. }
  29. bool CSws::set_dst_opt(AVPixelFormat pixfmt, int w, int h, std::string& err)
  30. {
  31. LOCK();
  32. CHECKSTOP(err);
  33. err = "opt succeed.";
  34. dst_pix_fmt_ = pixfmt;
  35. dst_w_ = w;
  36. dst_h_ = h;
  37. return true;
  38. }
  39. bool CSws::lock_opt(std::string& err)
  40. {
  41. LOCK();
  42. CHECKSTOP(err);
  43. err = "opt succeed.";
  44. swsctx_ = sws_getContext(src_w_, src_h_, src_pix_fmt_, dst_w_, dst_h_, dst_pix_fmt_, SWS_FAST_BILINEAR, nullptr, nullptr, nullptr);
  45. if (swsctx_ == nullptr)
  46. {
  47. err = "sws_getContext return nullptr.";
  48. return false;
  49. }
  50. status_ = LOCKED;
  51. return true;
  52. }
  53. bool CSws::unlock_opt(std::string& err)
  54. {
  55. LOCK();
  56. err = "opt succeed.";
  57. sws_freeContext(swsctx_);
  58. swsctx_ = nullptr;
  59. status_ = STOP;
  60. src_w_ = 0;
  61. src_h_ = 0;
  62. dst_w_ = 0;
  63. dst_h_ = 0;
  64. return true;
  65. }
  66. int CSws::scale(const uint8_t* const srcSlice[], const int srcStride[], int srcSliceY, int srcSliceH, uint8_t* const dst[], const int dstStride[], std::string& err)
  67. {
  68. LOCK();
  69. CHECKNOTSTOP(err);
  70. err = "opt succeed.";
  71. int ret = sws_scale(swsctx_, srcSlice, srcStride, srcSliceY, srcSliceH, dst, dstStride);
  72. CHECKFFRET(ret);
  73. return ret;
  74. }

测试

  1. // 视频帧转换
  2. void test_sws()
  3. {
  4. bool ret = false;
  5. std::string err;
  6. std::ifstream yuv("in.yuv", std::ios::binary);
  7. CSws sws;
  8. // 分配图像数据内存
  9. uint8_t* src[4] = { 0 };
  10. int srclinesize[4] = { 0 };
  11. uint8_t* dst[4] = { 0 };
  12. int dstlinesize[4] = { 0 };
  13. int srcsize = av_image_alloc(src, srclinesize, 640, 432, AV_PIX_FMT_YUV420P, 1);
  14. int dstsize = av_image_alloc(dst, dstlinesize, 320, 240, AV_PIX_FMT_BGR24, 1);
  15. yuv.read(reinterpret_cast<char*>(src[0]), 640 * 432);
  16. yuv.read(reinterpret_cast<char*>(src[1]), 640 * 432 / 4);
  17. yuv.read(reinterpret_cast<char*>(src[2]), 640 * 432 / 4);
  18. ret = sws.set_src_opt(AV_PIX_FMT_YUV420P, 640, 432, err);
  19. TESTCHECKRET(ret);
  20. ret = sws.set_dst_opt(AV_PIX_FMT_BGR24, 320, 240, err);
  21. TESTCHECKRET(ret);
  22. ret = sws.lock_opt(err);
  23. TESTCHECKRET(ret);
  24. int size = sws.scale(src, srclinesize, 0, 432, dst, dstlinesize, err);
  25. std::cout << "sws " << size << " line" << std::endl;
  26. std::ofstream bgr("out.bgr", std::ios::binary);
  27. bgr.write(reinterpret_cast<char*>(dst[0]), dstsize);
  28. ret = sws.unlock_opt(err);
  29. TESTCHECKRET(ret);
  30. // 清理
  31. if (src != nullptr)
  32. {
  33. av_freep(&src[0]);
  34. }
  35. av_freep(&src);
  36. if (dst != nullptr)
  37. {
  38. av_freep(&dst[0]);
  39. }
  40. av_freep(&dst);
  41. }

FFmpeg4.0笔记:封装ffmpeg的视频帧转换功能类CSws的更多相关文章

  1. FFmpeg4.0笔记:本地媒体文件解码、帧格式转换、重采样、编码、封装、转封装、avio、硬解码等例子

    Github https://github.com/gongluck/FFmpeg4.0-study/blob/master/official%20example/my_example.cpp #in ...

  2. FFmpeg解码视频帧为jpg图片保存到本地

    FFmpeg解码视频帧为jpg图片保存到本地 - CSDN博客 https://blog.csdn.net/qq_28284547/article/details/78151635

  3. C#使用FFmpeg 将视频格式转换成Gif图片示例

    根据EFmpeg封装的视频转换gif工具:https://my.oschina.net/tianma3798/blog/825317 一.本次使用参数说明 /* * 参数说明: * -i 源文件位置 ...

  4. NET 2.0(C#)调用ffmpeg处理视频的方法

    另外:ffmpeg的net封装库 http://www.intuitive.sk/fflib/ NET 2.0 调用FFMPEG,并异步读取输出信息的代码...public void ConvertV ...

  5. 基于C#利用ffmpeg提取视频帧

    利用ffmepg提取视频帧实际上是利用C#调用ffmepg命令行进行处理对应的视频,然后输出出视频帧 GetPicFromVideo("); static public string Get ...

  6. FFmpeg进行视频帧提取&音频重采样-Process.waitFor()引发的阻塞超时

    由于产品需要对视频做一系列的解析操作,利用FFmpeg命令来完成视频的音频提取.第一帧提取作为封面图片.音频重采样.字幕压缩等功能: 前一篇文章已经记录了FFmpeg在JAVA中的使用-音频提取&am ...

  7. 利用ffmpeg获取视频帧

    如果要对视频帧进行处理,可以先把视频帧读取出来. sh文件代码如下: #!/usr/bin/env sh VIDEO=/home/xxx/video/ FRAMES=/home/xxx/frame/ ...

  8. C#使用FFmpeg 将视频格式转换成MP4示例

    一.常用视频格式分辨率 640x480p 720p格式,分辨率为1280×720p / 60Hz,行频为45kHz 1080p格式,分辨率为1920×1080逐行扫描,专业格式 二.FFmpeg部分参 ...

  9. FFmpeg4.0笔记:封装ffmpeg的解封装功能类CDemux

    Github https://github.com/gongluck/FFmpeg4.0-study/tree/master/Cff CDemux.h /*********************** ...

随机推荐

  1. brute爆破

    0X01明文传输的表单爆破用户名和密码 不存在任何加密 直接爆破即可 当不存在用户名时: 当存在用户名时,密码错误: 这里由于靶场关了 所以我们用dvwa演示 但是dvwa没有以上的差别 所以我们默认 ...

  2. IDEA:Process finished with exit code -1073741819 (0xC0000005)

    出门左转:https://www.cnblogs.com/virgosnail/p/10335224.html

  3. Fastadmin 后台编辑,或者添加的时候,出现的问题

    1.情况如图:编辑的时候,这个关联id,默认查出来的是用户昵称,如果要显示用户名,该怎么修改,不要着急,听我慢慢道来 2.首先要找到 编辑页面,检查问题 3.完成

  4. 尚学堂requireJs课程---3、私有和公有属性和方法

    尚学堂requireJs课程---3.私有和公有属性和方法 一.总结 一句话总结: 在 [模块] 的基础上,在return对象里面的方法和属性就是公有的(因为外部可以访问),不在的就是私有的 < ...

  5. java 直接内存

    android 内存结构 : dalvik(jvm)内存---navtive men 两部分. 这个概念相信有经验的开发人员都会知道. java虚拟机分配到的内存是有限的,根据手机不同,大小不一,但也 ...

  6. [windows菜鸟]C#中调用Windows API参考工具

    很多windows API都不知道签名,可以从下面几种方式进行查询 1.微软出的工具 P/Invoke Interop Assistant version 1.0 2.网站 pinvoke.net 3 ...

  7. 2017年内容营销如何提高ROI转化率

    根据2017 CMI报告显示,有近41%的营销人员今年会实施一系列内容营销战略.作为与用户间长期关系的桥梁, 从品牌化输出到信任感的培育,内容营销的影响力迅猛发展. 本次Focussend从互动集成内 ...

  8. mongdb mapReduce聚合操作

    1.数据准备 请看group操作 2.mapReduce名词解释 mapReduce 随着"大数据"概念而流行.其实mapReduce的概念非常简单,从功能上说,相当于RDBMS的 ...

  9. Java-获取当前IP归属地

    知道IP,获取当前IP归属地的Java程序: package Main; import java.io.BufferedReader; import java.io.DataOutputStream; ...

  10. 【学习笔记】python3中csv文件使用

    1. reader=csv.reader(f, delimiter=','):按行读取数据,reader为生成器,读取的每行数据为列表格式,可以通过delimiter参数指定分隔符. import c ...