当前位置: 首页 > news >正文

网站网业设计广州做地铁的公司网站

网站网业设计,广州做地铁的公司网站,seo入门课程,c 能用来做网站吗通过FFmpeg对视频进行编解码时#xff0c;如果输入文件存在本机或通过USB摄像头、笔记本内置摄像头获取数据时#xff0c;可通过avformat_open_input接口中的第二个参数直接指定即可。但如果待处理的视频数据存在于内存块中时#xff0c;该如何指定#xff0c;可通过FFmpeg…      通过FFmpeg对视频进行编解码时如果输入文件存在本机或通过USB摄像头、笔记本内置摄像头获取数据时可通过avformat_open_input接口中的第二个参数直接指定即可。但如果待处理的视频数据存在于内存块中时该如何指定可通过FFmpeg中的结构体AVIOContext实现此时avformat_open_input中的第二个参数传nullptr。 涉及到FFmpeg中的主要函数是avio_alloc_context,声明如下 AVIOContext *avio_alloc_context(unsigned char *buffer,int buffer_size,int write_flag,void *opaque,int (*read_packet)(void *opaque, uint8_t *buf, int buf_size),int (*write_packet)(void *opaque, uint8_t *buf, int buf_size),int64_t (*seek)(void *opaque, int64_t offset, int whence)) (1).buffer通过AVIOContext进行输入/输出操作的内存块由av_malloc分配av_free释放。av_read_frame会持续从此处取数据。       (2).buffer_size: 内存块大小。       (3).write_flag: 如果buffer作为输出即写入则为1(FFmpeg将处理后的数据写入buffer)如果buffer作为输入则设置为0(FFmpeg从buffer获取数据).       (4).opaque: 指向用户特定数据的不透明指针。       (5).read_packet: 回调函数当buffer作为输入时必须指定否则可为nullptr。此回调函数的参数依次为avio_alloc_context中的opaque、buffer、buffer_size。       (6).write_packet:回调函数当buffer作为输出时必须指定否则可为nullptr。此回调函数的参数依次为avio_alloc_context中的opaque、buffer、buffer_size。       (7).seek回调函数用于查找指定字节位置的函数可为nullptr。       调用完此接口后需要将此接口返回的指针赋值给AVFormatContext的pb即I/O context。       以下为测试代码段 (1).主线程用于实时显示内存块内容。另有一个单独线程用于创建数据。这里使用队列线程set_packet持续向队列中push数据回调函数read_packet持续从队列中pop数据 typedef struct Buffer {unsigned char* data;unsigned int length; } Buffer;class BufferQueue { public:BufferQueue() default;~BufferQueue() {}void push(Buffer buffer) {std::unique_lockstd::mutex lck(mtx);queue.push(buffer);cv.notify_all();}void pop(Buffer buffer) {std::unique_lockstd::mutex lck(mtx);while (queue.empty()) {cv.wait(lck);}buffer queue.front();queue.pop();}unsigned int size() {return queue.size();}private:std::queueBuffer queue;std::mutex mtx;std::condition_variable cv; };class PacketScaleQueue { public:PacketScaleQueue() default;~PacketScaleQueue() {Buffer buffer;while (getPacketSize() 0) {popPacket(buffer);delete[] buffer.data;}while (getScaleSize() 0) {popScale(buffer);delete[] buffer.data;}}void init(unsigned int buffer_num 16, unsigned int buffer_size 1024 * 1024 * 4) {for (unsigned int i 0; i buffer_num; i) {Buffer buffer { new unsigned char[buffer_size], buffer_num};pushPacket(buffer);}}void pushPacket(Buffer buffer) { packet_queue.push(buffer); }void popPacket(Buffer buffer) { packet_queue.pop(buffer); }unsigned int getPacketSize() { return packet_queue.size(); }void pushScale(Buffer buffer) { scale_queue.push(buffer); }void popScale(Buffer buffer) { scale_queue.pop(buffer); }unsigned int getScaleSize() { return scale_queue.size(); }private:BufferQueue packet_queue, scale_queue; }; (2).线程函数set_packet内容如下类PacketScaleQueue中有两个BufferQueue: packet_queue未被使用的scale_queue已被使用的 void set_packet(PacketScaleQueue packet_encode) {while (packet_encode_flag) {static unsigned char v1 0, v2 0, v3 255;static const size_t size height * width;Buffer buffer;packet_encode.popPacket(buffer);memset(buffer.data, v1, size);memset(buffer.data size, v2, size);memset(buffer.data size * 2, v3, size);packet_encode.pushScale(buffer);v1;v2;--v3;if (v1 255) v1 0;if (v2 255) v2 0;if (v3 0) v3 255;std::this_thread::sleep_for(std::chrono::milliseconds(40));} } (3).回调函数read_packet内容如下 int read_packet(void* opaque, uint8_t* buf, int buf_size) {PacketScaleQueue* packet_encode static_castPacketScaleQueue*(opaque);Buffer buffer;packet_encode-popScale(buffer);memcpy(buf, buffer.data, buf_size);packet_encode-pushPacket(buffer);return buf_size; } (4).主函数test_ffmpeg_avio_show内容如下 int test_ffmpeg_avio_show() {PacketScaleQueue packet_encode;packet_encode.init(30, block_size);std::thread thread_packet(set_packet, std::ref(packet_encode));uint8_t* avio_ctx_buffer static_castuint8_t*(av_malloc(block_size));if (!avio_ctx_buffer) {print_error_string(AVERROR(ENOMEM));return -1;}AVIOContext* avio_ctx avio_alloc_context(avio_ctx_buffer, block_size, 0, packet_encode, read_packet, nullptr, nullptr);if (!avio_ctx) {print_error_string(AVERROR(ENOMEM));return -1;}AVFormatContext* ifmt_ctx avformat_alloc_context();if (!ifmt_ctx) {print_error_string(AVERROR(ENOMEM));return -1;}ifmt_ctx-pb avio_ctx;AVDictionary* dict nullptr;av_dict_set(dict, video_size, 640x480, 0);av_dict_set(dict, pixel_format, bgr24, 0);auto ret avformat_open_input(ifmt_ctx, nullptr, av_find_input_format(rawvideo), dict);if (ret 0) {fprintf(stderr, Could not open input\n);print_error_string(ret);return ret;}ret avformat_find_stream_info(ifmt_ctx, nullptr);if (ret 0) {fprintf(stderr, Could not find stream information\n);print_error_string(ret);return ret;}av_dump_format(ifmt_ctx, 0, nothing, 0);int video_stream_index -1;for (unsigned int i 0; i ifmt_ctx-nb_streams; i) {const AVStream* stream ifmt_ctx-streams[i];if (stream-codecpar-codec_type AVMEDIA_TYPE_VIDEO) {video_stream_index i;fprintf(stdout, type of the encoded data: %d, dimensions of the video frame in pixels: width: %d, height: %d, pixel format: %d\n,stream-codecpar-codec_id, stream-codecpar-width, stream-codecpar-height, stream-codecpar-format);}}if (video_stream_index -1) {fprintf(stderr, error: no video stream\n);return -1;}AVCodecParameters* codecpar ifmt_ctx-streams[video_stream_index]-codecpar;if (codecpar-codec_id ! AV_CODEC_ID_RAWVIDEO) {fprintf(stderr, error: this test code only support rawvideo encode: %d\n, codecpar-codec_id);return -1;}AVPacket* packet static_castAVPacket*(av_malloc(sizeof(AVPacket)));if (!packet) {fprintf(stderr, fail to av_malloc\n);return -1;}cv::Mat mat(height, width, CV_8UC3);const char* winname show video;cv::namedWindow(winname);while (1) {ret av_read_frame(ifmt_ctx, packet);if (ret 0 packet-stream_index video_stream_index packet-size 0) {mat.data packet-data;cv::imshow(winname, mat);av_packet_unref(packet);int key cv::waitKey(30);if (key 27) {packet_encode_flag false;break;}}}av_freep(packet);cv::destroyWindow(winname);avformat_close_input(ifmt_ctx);// note: the internal buffer could have changed, and be ! avio_ctx_bufferif (avio_ctx) {av_freep(avio_ctx-buffer);av_freep(avio_ctx);}//avio_context_free(avio_ctx); av_freep(avio_ctx);av_dict_free(dict);thread_packet.join();fprintf(stdout, test finish\n);return 0; } 执行结果如下图所示 GitHubhttps://github.com/fengbingchun/OpenCV_Test
http://www.laogonggong.com/news/138570.html

相关文章:

  • wordpress添加微博刷神马seo排名首页排名
  • 蓟县集团网站建设微信商城在哪儿打开
  • 020网站建设和维护费用做家政网站公司名称
  • wordpress腾讯云插件下载广州17年seo优化技术电话
  • 网站开发 不好 怎么说一站式做网站
  • 网页游戏网站那个好手机网站有什么区别吗
  • 有什么可以在线做数学题的网站网站做系统叫什么名字
  • 惠州cms建站系统怎样注册网站建立网页
  • 模板做的网站如何下载临沧网站制作
  • 合肥做网站汇站网中山建设信息网站
  • wordpress 邮件 key攀枝花网站seo
  • seo网站优化工具一个人免费观看视频播放
  • 广西智能网站建设方案软件开发环境
  • 图书馆建设网站注意点三峡建设管理有限公司网站
  • 医疗 企业 网站建设长沙做网站最好的公司有哪些
  • 飓风算法恢复的网站巨野城乡住房建设局网站
  • 三五互联做网站怎么样免费网站建设阿里云
  • 企业网站制作公司有哪些有限公司与有限责任公司的区别
  • iis做的网站模板福建有没有网站做鞋子一件代发
  • 南村网站建设安阳网站如何做优化
  • 公司最近想做个网站怎么办沈阳招标信息网
  • 美丽南方官网网站建设自己做网站不推广
  • steam做皮肤网站视频点播网站开发教程
  • html网站可以做访问统计吗如何生成网站的二维码
  • wordpress缓存网站首页wordpress邮箱验证注册
  • 海门做网站WordPress分享无法显示
  • 网站建设的搜索语句公司网络维修
  • 制作网站需要哪些工具南昌网站建设效果
  • 中英文网站建设施工企业破产质保
  • 制作网站公司定价网站设置时间段访问