您的位置:首页 > 编程语言

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,所以弄了有几天。网上没有这部分答案。

其实是写在差不多类似下面的代码:

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写进去了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息