FFmpeg给mp4视频加上旋转90度的代码
2016-03-01 21:22
204 查看
1、准备h264视频流。(这之前可能是yuv转成的视频流。)
2、准备aac音频流。
3、开始muxer成mp4。
一、如果初始视频是ios或者安卓手机拍摄的竖拍视频,那么这个视频是有90,180,270这样的旋转角度的。
比如本来宽高比是720*1080,但是安卓和iphone手机拍出的视频的宽高却是1080*720,但是在metadata里标记了rotate=90。
当你从原始的倒立视频中折腾出yuv,它确是倒立的。
二、yuv转为h264视频流。
三、合并h264和aac进入mp4容器。在这个地方,就需要把rotate的90度写入视频。因为是新手,不是很熟悉ffmpeg,所以弄了有几天。网上没有这部分答案。
其实是写在差不多类似下面的代码:
这样就ok了!
看最后dump视频的信息:
Output #0, mp4, to '/var/mobile/Containers/Data/Application/5B1DE047-A88C-48C2-B89A-FB5B57381A95/Documents/video/success.mp4':
Stream #0:0: Video: h264, yuv420p, 1920x1080, q=2-31, 50 tbc
Metadata:
rotate : 90
Stream #0:1: Audio: aac, 44100 Hz, mono, fltp, 67 kb/s
已经把rotate写进去了。
2、准备aac音频流。
3、开始muxer成mp4。
一、如果初始视频是ios或者安卓手机拍摄的竖拍视频,那么这个视频是有90,180,270这样的旋转角度的。
比如本来宽高比是720*1080,但是安卓和iphone手机拍出的视频的宽高却是1080*720,但是在metadata里标记了rotate=90。
当你从原始的倒立视频中折腾出yuv,它确是倒立的。
二、yuv转为h264视频流。
三、合并h264和aac进入mp4容器。在这个地方,就需要把rotate的90度写入视频。因为是新手,不是很熟悉ffmpeg,所以弄了有几天。网上没有这部分答案。
其实是写在差不多类似下面的代码:
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; } }
AVMEDIA_TYPE_VIDEO 判断是视频流,然后申请out_stream,它是AVStream结构。里面就有mateData,所以可以写进去了。
给每一帧写入:
ret = av_dict_set(&out_stream->metadata,"rotate","90",0); //设置旋转角度
这样就ok了!
看最后dump视频的信息:
Output #0, mp4, to '/var/mobile/Containers/Data/Application/5B1DE047-A88C-48C2-B89A-FB5B57381A95/Documents/video/success.mp4':
Stream #0:0: Video: h264, yuv420p, 1920x1080, q=2-31, 50 tbc
Metadata:
rotate : 90
Stream #0:1: Audio: aac, 44100 Hz, mono, fltp, 67 kb/s
已经把rotate写进去了。
相关文章推荐
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- Managed Media Aggregation using Rtsp and Rtp
- [总结]FFMPEG视音频编解码零基础学习方法
- 用VBScript写合并文本文件的脚本
- oracle列合并的实现方法
- 使用BAT一句话命令实现快速合并JS、CSS
- SQL 合并多行记录的方法总汇
- C#实现简单合并word文档的方法
- C#自适应合并文件的方法
- Node.js实现JS文件合并小工具
- 利用Ffmpeg获得flv视频缩略图和视频时间的代码
- GridView单元格合并
- 如何合并多个 .NET 程序集
- 使用UglifyJS合并/压缩JavaScript的方法
- 高性能WEB开发 JS、CSS的合并、压缩、缓存管理
- 多个js与css文件的合并方法详细说明
- 使用不同的方法结合/合并两个JS数组
- codeigniter教程之上传视频并使用ffmpeg转flv示例
- 合并Excel工作薄中成绩表的VBA代码,非常适合教育一线的朋友
- 用js实现table单元格高宽调整,兼容合并单元格(兼容IE6、7、8、FF)实例