资源简介
基于ffmpeg将avi视频转换为mp4视频,先将avi转为yuv420p视频帧序列,后将视频帧序列转为mp4视频
代码片段和文件信息
extern “C“
{
#include “libavformat\avformat.h“
#include “libavdevice\avdevice.h“
#include “libswscale\swscale.h“
};
int pNewWidth = 0;
int pNewHeight = 0;
void SetVideoframe(AVCodecContext *pCodecCtx AVframe *pframe AVframe *pNewframe int pNewWidth int pNewHeight)
{
pNewframe->linesize[0] = pNewWidth;
pNewframe->linesize[1] = pNewWidth / 2;
pNewframe->linesize[2] = pNewWidth / 2;
struct SwsContext *pSwsCtx = NULL;
pSwsCtx = sws_getContext(pCodecCtx->width pCodecCtx->height PIX_FMT_YUV420P pNewWidth pNewHeight PIX_FMT_YUV420P SWS_SINC NULL NULL NULL);
if (pSwsCtx == NULL)
return;
sws_scale(pSwsCtx pframe->data pframe->linesize 0 pCodecCtx->height pNewframe->data pNewframe->linesize);
sws_freeContext(pSwsCtx);
}
int VideoDecode(char *VideoName char* YUVName)
{
FILE *fw = fopen(YUVName “wb“);
if (fw == NULL)
return -1;
AVFormatContext *pFormatContext = NULL;
pFormatContext = avformat_alloc_context();
if (avformat_open_input(&pFormatContext VideoName NULL NULL) != 0)
return -2;
if (avformat_find_stream_info(pFormatContext NULL) < 0)
{
avformat_close_input(&pFormatContext);
return -3;
}
AVCodecContext *pCodecContext = NULL;
pCodecContext = pFormatContext->streams[0]->codec;
AVCodec *pCodec = NULL;
pCodec = avcodec_find_decoder(pCodecContext->codec_id);
if (pCodec == NULL)
{
avformat_close_input(&pFormatContext);
return -4;
}
if (avcodec_open2(pCodecContext pCodec NULL) < 0)
{
avformat_close_input(&pFormatContext);
return -5;
}
AVframe *pframe *pframeDispose;
pframe = av_frame_alloc();
pframeDispose = av_frame_alloc();
if ((pframe == NULL) || (pframeDispose == NULL))
{
avcodec_close(pCodecContext);
avformat_close_input(&pFormatContext);
return -6;
}
pNewWidth = pCodecContext->width;
pNewHeight = pCodecContext->height;
int DisposeSize = avpicture_get_size(PIX_FMT_YUV420P pCodecContext->width pCodecContext->height);
uint8_t *DisposeBuf = (uint8_t *)av_malloc(DisposeSize*sizeof(uint8_t));
avpicture_fill((AVPicture *)pframeDispose DisposeBuf PIX_FMT_YUV420P pCodecContext->width pCodecContext->height);
AVPacket pPacket;
int got_picture_ptr = 0;
while (av_read_frame(pFormatContext &pPacket) >= 0)
{
if (pPacket.stream_index == 0)
{
if (avcodec_decode_video2(pCodecContext pframe &got_picture_ptr &pPacket) >= 0)
{
if (got_picture_ptr)
{
SetVideoframe(pCodecContext pframe pframeDispose pCodecContext->width pCodecContext->height);
fwrite(DisposeBuf 1 DisposeSize fw);
}
}
}
}
fclose(fw);
av_free(DisposeBuf);
av_frame_free(&pframeDispose);
av_frame_free(&pframe);
avcodec_close(pCodecContext);
avformat_close_input(&pFormatContext);
return 0;
}
int yuv420p_to_mp4(char* yuv420p_name char* mp4_name)
{
FILE* fr_yuv420p = fopen(yuv420p_name “rb“);
if (fr_yuv420p == NULL)
return -1;
AVOutputFormat* pOutputForm
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2017-01-05 16:47 FFmpeg_avi_to_mp4\
目录 0 2017-01-05 16:47 FFmpeg_avi_to_mp4\Debug\
文件 40960 2017-01-05 16:45 FFmpeg_avi_to_mp4\Debug\FFmpeg.exe
文件 290372 2017-01-05 16:45 FFmpeg_avi_to_mp4\Debug\FFmpeg.ilk
文件 478208 2017-01-05 16:45 FFmpeg_avi_to_mp4\Debug\FFmpeg.pdb
目录 0 2017-01-05 16:47 FFmpeg_avi_to_mp4\FFmpeg\
文件 104448 2017-01-05 16:00 FFmpeg_avi_to_mp4\FFmpeg\20170105.avi
目录 0 2017-01-05 16:47 FFmpeg_avi_to_mp4\FFmpeg\Debug\
文件 927 2017-01-05 16:45 FFmpeg_avi_to_mp4\FFmpeg\Debug\FFmpeg.Build.CppClean.log
文件 3554 2017-01-05 16:45 FFmpeg_avi_to_mp4\FFmpeg\Debug\FFmpeg.log
文件 23416 2017-01-05 16:45 FFmpeg_avi_to_mp4\FFmpeg\Debug\FFmpeg.obj
目录 0 2017-01-05 16:47 FFmpeg_avi_to_mp4\FFmpeg\Debug\FFmpeg.tlog\
文件 8330 2017-01-05 16:45 FFmpeg_avi_to_mp4\FFmpeg\Debug\FFmpeg.tlog\CL.read.1.tlog
文件 548 2017-01-05 16:45 FFmpeg_avi_to_mp4\FFmpeg\Debug\FFmpeg.tlog\CL.write.1.tlog
文件 178 2017-01-05 16:45 FFmpeg_avi_to_mp4\FFmpeg\Debug\FFmpeg.tlog\FFmpeg.lastbuildstate
文件 682 2017-01-05 16:45 FFmpeg_avi_to_mp4\FFmpeg\Debug\FFmpeg.tlog\cl.command.1.tlog
文件 1730 2017-01-05 16:45 FFmpeg_avi_to_mp4\FFmpeg\Debug\FFmpeg.tlog\li
文件 3892 2017-01-05 16:45 FFmpeg_avi_to_mp4\FFmpeg\Debug\FFmpeg.tlog\li
文件 522 2017-01-05 16:45 FFmpeg_avi_to_mp4\FFmpeg\Debug\FFmpeg.tlog\li
文件 150528 2017-01-05 16:45 FFmpeg_avi_to_mp4\FFmpeg\Debug\vc120.idb
文件 135168 2017-01-05 16:45 FFmpeg_avi_to_mp4\FFmpeg\Debug\vc120.pdb
文件 7804 2017-01-05 16:45 FFmpeg_avi_to_mp4\FFmpeg\FFmpeg.cpp
文件 4482 2017-01-05 15:48 FFmpeg_avi_to_mp4\FFmpeg\FFmpeg.vcxproj
文件 955 2015-09-06 11:08 FFmpeg_avi_to_mp4\FFmpeg\FFmpeg.vcxproj.filters
文件 143 2015-09-06 11:06 FFmpeg_avi_to_mp4\FFmpeg\FFmpeg.vcxproj.user
文件 22361088 2015-06-05 10:06 FFmpeg_avi_to_mp4\FFmpeg\avcodec-56.dll
文件 1380352 2015-06-05 10:06 FFmpeg_avi_to_mp4\FFmpeg\avdevice-56.dll
文件 2393600 2015-06-05 10:06 FFmpeg_avi_to_mp4\FFmpeg\avfilter-5.dll
文件 6006784 2015-06-05 10:06 FFmpeg_avi_to_mp4\FFmpeg\avformat-56.dll
文件 493568 2015-06-05 10:06 FFmpeg_avi_to_mp4\FFmpeg\avutil-54.dll
目录 0 2017-01-05 16:47 FFmpeg_avi_to_mp4\FFmpeg\include\
............此处省略123个文件信息
相关资源
- Qt实现的简单的中国象棋程序
- 数据加密与数字签名系统
- Kinect手势代替鼠标控制PC
- 物业费管理系统源码超详细注释附文
- 长整数的代数计算 算法
- 二进制方式打包和解包文件
- 个人银行账户管理系统
- 使用ffmpeg将多张图片生成H264裸流并获
- OpenGL场景漫游
- VS开发进阶源码---烟花特效的生日祝福
- 资源管理器 中国地质大学数据结构
- 设停车场内只有一个可停放n辆汽车的
- vc写的一个游戏里面三维场景漫游
- 编程常用的素材(含png、jif、bmp、j
- Midas to FLAC3D-vs2010
- 直通BAT算法精讲
- ros小海龟定点移动程序
- 学生成绩档案管理系统—保证可用
- 面试算法LeetCode刷题班
- 交通咨询模拟系统
- Qt开机唤醒狩猎者
- 路由分组转发仿真系统的设计与实现
- 周立功CAN接口开发资料
- 仿QQ截图工具源代码
- NOIP必学内容之前缀和与差分颜鸿宇
- QT利用realtimechart画波形图
- 基于OpenCV3.0的手势识别.rar
- QT实现音频实时传输
- Visual Studio Community 2017
- 天天爱消除
评论
共有 条评论