FFMPEG 工具方法

news/2025/1/16 1:51:59/
av_strerror
int av_strerror	(	int 	errnum,
char * 	errbuf,
size_t 	errbuf_size
)
ffmpegmp4_9">ffmpeg获取与设置mp4文件旋转方向方法

设置与获取都是对AVStream的dict操作.
设置

for (i = 0; i < ifmt_ctx_v->nb_streams; i++) {  //Create output AVStream according to input AVStream  if(ifmt_ctx_v->streams[i]->codec->codec_type==AVMEDIA_TYPE_VIDEO){  AVStream *in_stream = ifmt_ctx_v->streams[i];  AVStream *out_stream = avformat_new_stream(ofmt_ctx, in_stream->codec->codec);  videoindex_v=i;  if (!out_stream) {  printf( "Failed allocating output stream\n");  ret = AVERROR_UNKNOWN;  goto end;  }  videoindex_out=out_stream->index;  //Copy the settings of AVCodecContext  ret = av_dict_set(&out_stream->metadata,"rotate","90",0); //设置旋转角度  if(ret>=0)  {  printf("=========yes=====set rotate success!===\n");  }  if (avcodec_copy_context(out_stream->codec, in_stream->codec) < 0) {  printf( "Failed to copy context from input to output stream codec context\n");  goto end;  }  out_stream->codec->codec_tag = 0;  if (ofmt_ctx->oformat->flags & AVFMT_GLOBALHEADER)  out_stream->codec->flags |= CODEC_FLAG_GLOBAL_HEADER;  break;  }  }  

读取

for (i = 0; i < ifmt_ctx_v->nb_streams; i++) {  //Create output AVStream according to input AVStream  if(ifmt_ctx_v->streams[i]->codec->codec_type==AVMEDIA_TYPE_VIDEO){  AVStream *in_stream = ifmt_ctx_v->streams[i];  AVStream *out_stream = avformat_new_stream(ofmt_ctx, in_stream->codec->codec);  videoindex_v=i;  if (!out_stream) {  printf( "Failed allocating output stream\n");  ret = AVERROR_UNKNOWN;  goto end;  }  videoindex_out=out_stream->index;  //Copy the settings of AVCodecContext  ret = av_dict_set(&out_stream->metadata,"rotate","90",0); //设置旋转角度  if(ret>=0)  {  printf("=========yes=====set rotate success!===\n");  }  if (avcodec_copy_context(out_stream->codec, in_stream->codec) < 0) {  printf( "Failed to copy context from input to output stream codec context\n");  goto end;  }  out_stream->codec->codec_tag = 0;  if (ofmt_ctx->oformat->flags & AVFMT_GLOBALHEADER)  out_stream->codec->flags |= CODEC_FLAG_GLOBAL_HEADER;  break;  }  }  double g_rotate_theta = get_rotation(decoder->is_video);//is_video是video的AVStreamint rotate = 0;if (fabs(g_rotate_theta - 90) < 1.0){rotate = 90;}else if(fabs(g_rotate_theta - 180) < 1.0||fabs(g_rotate_theta + 180) < 1.0){rotate = 180;}else if(fabs(g_rotate_theta - 270) < 1.0||fabs(g_rotate_theta + 90) < 1.0){rotate = 270;}LOGI("get rotate is : %d" , rotate);metadata->rotate = rotate;

http://www.ppmy.cn/news/1508790.html

相关文章

工业智能网关在汽车制造企业的应用价值及功能-天拓四方

随着工业互联网的飞速发展&#xff0c;工业智能网关作为连接物理世界与数字世界的桥梁&#xff0c;正逐渐成为制造业数字化转型的核心组件。本文将以一家汽车制造企业的实际使用案例为蓝本&#xff0c;深入解析工业智能网关在实际应用中的价值、功能及其实操性。 一、背景与挑…

resource not found with Azure OpenAI service

题意&#xff1a;使用 Azure OpenAI 服务时&#xff0c;系统未能找到所请求的资源 问题背景&#xff1a; when I am using this demo code to use the Azure OpenAI service in Java 11: 当我在Java 11环境中使用这段示例代码来调用Azure OpenAI服务时&#xff1a; package …

Ubuntu20.04 运行深蓝路径规划hw1

前言 环境&#xff1a; ubuntu 20.04 &#xff1b; ROS版本&#xff1a; noetic&#xff1b; 问题 1、出现PCL报错&#xff1a;#error PCL requires C14 or above catkin_make 编译时&#xff0c;出现如下错误 解决&#xff1a; 在grid_path_searcher文件夹下面的CMakeLis…

mysql 5.XX 设置中文数据报错

mysql 5.XX 默认是 拉丁文&#xff0c;需要手动修改为 utf8&#xff0c; 查看 库 表 ddl show create database mydatabase; show create table mytable; 可以看到 字符集信息 方法&#xff1a;修改mysql文件 my.ini

SEO之网站结构优化(十-网址规范化2)

初创企业搭建网站的朋友看1号文章&#xff1b;想学习云计算&#xff0c;怎么入门看2号文章谢谢支持&#xff1a; 1、我给不会敲代码又想搭建网站的人建议 2、“新手上云”能够为你开启探索云世界的第一步 博客&#xff1a;阿幸SEO~探索搜索排名之道 4、301转向 1.什么是301转…

嵌入式内存管理高频面试题及参考答案(4万字长文)

目录 嵌入式系统中内存管理的重要性 嵌入式系统中的内存主要分为哪几类&#xff1f; 静态内存分配和动态内存分配的特点 内存对齐的概念及其作用 嵌入式系统中为什么需要关注内存碎片问题 内存分区的概念及其在嵌入式系统中的应用 内存映射文件的概念及其在嵌入式系统中…

C++相关概念和易错语法(25)(列表初始化、initializer_list)

列表初始化是C11中新增的初始化规则&#xff0c;大大增强了初始化的灵活性&#xff0c;在本篇文章中&#xff0c;我会详细讲解列表初始化的各种使用场景。 1.从C语言初始化语法开始改变——不带赋值号的初始化方式 列表初始化可以说是将C语言的一些初始化语法进行放大的结果。…

redis模块和ioredis的注意事项

redis模块和ioredis的注意事项 文章目录 redis模块和ioredis的注意事项前言一、ioredis和redis使用zrange的比较二、出现zrange结果不同的原因总结 前言 node.js在使用redis的时候有两个库可以选择&#xff0c;一个是redis、另一个是ioredis&#xff0c;我一直以来也没有太大关…