嵌入式linux------ffmpeg移植 解码H264(am335x解码H264到yuv420并通过SDL显示)
2016-07-13 10:17
801 查看
编译命令:arm-linux-gcc -o show2642 264showyuv2.c -I/usr/local/ffmpeg_arm/include/ -L/usr/local/ffmpeg_arm/lib/ -lswresample -lavformat -lavutil -lavcodec -lswscale -lx264 libSDL.a
*/
#include "stdio.h"
#include "stdlib.h"
#include "libavformat/avformat.h"
#include "libavdevice/avdevice.h"
#include "libswresample/swresample.h"
#include "libavutil/opt.h"
#include "libavutil/channel_layout.h"
#include "libavutil/parseutils.h"
#include "libavutil/samplefmt.h"
#include "libavutil/fifo.h"
#include "libavutil/intreadwrite.h"
#include "libavutil/dict.h"
#include "libavutil/mathematics.h"
#include "libavutil/pixdesc.h"
#include "libavutil/avstring.h"
#include "libavutil/imgutils.h"
#include "libavutil/timestamp.h"
#include "libavutil/bprint.h"
#include "libavutil/time.h"
#include "libavutil/threadmessage.h"
#include "/usr/local/ffmpeg_arm/include/SDL/SDL.h"
#include "libavfilter/avcodec.h"
#include "libavcodec/avcodec.h"
#if HAVE_SYS_RESOURCE_H
#include <sys/time.h>
#include <sys/types.h>
#include <sys/resource.h>
#elif HAVE_GETPROCESSTIMES
#include <windows.h>
#endif
#if HAVE_GETPROCESSMEMORYINFO
#include <windows.h>
#include <psapi.h>
#endif
http://blog.sina.com.cn/s/blog_163f91c5e0102wnyx.html http://blog.sina.com.cn/s/blog_14d8952290102wii0.html http://blog.sina.com.cn/s/blog_15e1433c30102wd1v.html http://blog.sina.com.cn/s/blog_15e1433c30102wd1x.html http://blog.sina.com.cn/s/blog_14d8952290102wii4.html http://blog.sina.com.cn/s/blog_15e1433c30102wd20.html http://tieba.baidu.com/p/4665234070 http://tieba.baidu.com/p/4667230793 http://tieba.baidu.com/p/4667235501
int w = 720;
int h = 576,retu;
SDL_Rect rect;
av_register_all();
AVFrame *pFrame_ = NULL;
/* find the video encoder */
AVCodec *videoCodec = avcodec_find_decoder(CODEC_ID_H264);//得到264的解码器类
if(!videoCodec)
{
printf("avcodec_find_decoder error\n");
return -1;
}
AVCodecParserContext *avParserContext = av_parser_init(CODEC_ID_H264);//得到解析帧类,主要用于后面的帧头查找
if(!avParserContext)
{
printf("av_parser_init error\n");
return -1;
}
AVCodecContext *codec_ = avcodec_alloc_context3(videoCodec);//解码会话层
if(!codec_)
{
printf("avcodec_alloc_context3 error\n");
return -1;
}
//初始化参数,下面的参数应该由具体的业务决定
codec_->time_base.num = 1;
codec_->frame_number = 1; //每包一个视频帧
codec_->codec_type = AVMEDIA_TYPE_VIDEO;
codec_->bit_rate = 0;
codec_->time_base.den = 25;//帧率
codec_->width = 720;//视频宽
codec_->height = 576;//视频高
if(avcodec_open2(codec_, videoCodec, NULL) >= 0)//打开解码器
{
http://blog.sina.com.cn/s/blog_163f91c5e0102wnyx.html http://blog.sina.com.cn/s/blog_14d8952290102wii0.html http://blog.sina.com.cn/s/blog_15e1433c30102wd1v.html http://blog.sina.com.cn/s/blog_15e1433c30102wd1x.html http://blog.sina.com.cn/s/blog_14d8952290102wii4.html http://blog.sina.com.cn/s/blog_15e1433c30102wd20.html http://tieba.baidu.com/p/4665234070 http://tieba.baidu.com/p/4667230793 http://tieba.baidu.com/p/4667235501
AVPacket packet = {0};
int dwBufsize = 10;
int frameFinished = dwBufsize;//这个是随便填入数字,没什么作用
av_init_packet(&packet);
packet.data = NULL;//这里填入一个指向完整H264数据帧的指针
packet.size = 0;//这个填入H264数据帧的大小
FILE *myH264 = fopen("1.264", "rb");//解码的文件264
if(myH264 == NULL)
{
perror("cant open 264 file\n");
return -1;
}
FILE *yuvfile = fopen("my264.yuv", "wb");//成功解码后保存成的YUV文件, 可以用YUV工具打开浏览
if(yuvfile == NULL)
{
perror("cant open YUV file\n");
return -1;
}
*/
#include "stdio.h"
#include "stdlib.h"
#include "libavformat/avformat.h"
#include "libavdevice/avdevice.h"
#include "libswresample/swresample.h"
#include "libavutil/opt.h"
#include "libavutil/channel_layout.h"
#include "libavutil/parseutils.h"
#include "libavutil/samplefmt.h"
#include "libavutil/fifo.h"
#include "libavutil/intreadwrite.h"
#include "libavutil/dict.h"
#include "libavutil/mathematics.h"
#include "libavutil/pixdesc.h"
#include "libavutil/avstring.h"
#include "libavutil/imgutils.h"
#include "libavutil/timestamp.h"
#include "libavutil/bprint.h"
#include "libavutil/time.h"
#include "libavutil/threadmessage.h"
#include "/usr/local/ffmpeg_arm/include/SDL/SDL.h"
#include "libavfilter/avcodec.h"
#include "libavcodec/avcodec.h"
#if HAVE_SYS_RESOURCE_H
#include <sys/time.h>
#include <sys/types.h>
#include <sys/resource.h>
#elif HAVE_GETPROCESSTIMES
#include <windows.h>
#endif
#if HAVE_GETPROCESSMEMORYINFO
#include <windows.h>
#include <psapi.h>
#endif
http://blog.sina.com.cn/s/blog_163f91c5e0102wnyx.html http://blog.sina.com.cn/s/blog_14d8952290102wii0.html http://blog.sina.com.cn/s/blog_15e1433c30102wd1v.html http://blog.sina.com.cn/s/blog_15e1433c30102wd1x.html http://blog.sina.com.cn/s/blog_14d8952290102wii4.html http://blog.sina.com.cn/s/blog_15e1433c30102wd20.html http://tieba.baidu.com/p/4665234070 http://tieba.baidu.com/p/4667230793 http://tieba.baidu.com/p/4667235501
int w = 720;
int h = 576,retu;
SDL_Rect rect;
av_register_all();
AVFrame *pFrame_ = NULL;
/* find the video encoder */
AVCodec *videoCodec = avcodec_find_decoder(CODEC_ID_H264);//得到264的解码器类
if(!videoCodec)
{
printf("avcodec_find_decoder error\n");
return -1;
}
AVCodecParserContext *avParserContext = av_parser_init(CODEC_ID_H264);//得到解析帧类,主要用于后面的帧头查找
if(!avParserContext)
{
printf("av_parser_init error\n");
return -1;
}
AVCodecContext *codec_ = avcodec_alloc_context3(videoCodec);//解码会话层
if(!codec_)
{
printf("avcodec_alloc_context3 error\n");
return -1;
}
//初始化参数,下面的参数应该由具体的业务决定
codec_->time_base.num = 1;
codec_->frame_number = 1; //每包一个视频帧
codec_->codec_type = AVMEDIA_TYPE_VIDEO;
codec_->bit_rate = 0;
codec_->time_base.den = 25;//帧率
codec_->width = 720;//视频宽
codec_->height = 576;//视频高
if(avcodec_open2(codec_, videoCodec, NULL) >= 0)//打开解码器
{
http://blog.sina.com.cn/s/blog_163f91c5e0102wnyx.html http://blog.sina.com.cn/s/blog_14d8952290102wii0.html http://blog.sina.com.cn/s/blog_15e1433c30102wd1v.html http://blog.sina.com.cn/s/blog_15e1433c30102wd1x.html http://blog.sina.com.cn/s/blog_14d8952290102wii4.html http://blog.sina.com.cn/s/blog_15e1433c30102wd20.html http://tieba.baidu.com/p/4665234070 http://tieba.baidu.com/p/4667230793 http://tieba.baidu.com/p/4667235501
AVPacket packet = {0};
int dwBufsize = 10;
int frameFinished = dwBufsize;//这个是随便填入数字,没什么作用
av_init_packet(&packet);
packet.data = NULL;//这里填入一个指向完整H264数据帧的指针
packet.size = 0;//这个填入H264数据帧的大小
FILE *myH264 = fopen("1.264", "rb");//解码的文件264
if(myH264 == NULL)
{
perror("cant open 264 file\n");
return -1;
}
FILE *yuvfile = fopen("my264.yuv", "wb");//成功解码后保存成的YUV文件, 可以用YUV工具打开浏览
if(yuvfile == NULL)
{
perror("cant open YUV file\n");
return -1;
}
相关文章推荐
- C#生成Word文档代码示例
- 如何使用C#从word文档中提取图片
- jQuery窗口、文档、网页各种高度的精确理解
- Mysql IO 内存方面的优化
- 比较全的一个C#操作word文档示例
- 用JavaScript获取页面文档内容的实现代码
- Node.js 的异步 IO 性能探讨
- C#编程实现Excel文档中搜索文本内容的方法及思路
- SQL Server误区30日谈 第22天 资源调控器可以调控IO
- mysql 数据同步 出现Slave_IO_Running:No问题的解决方法小结
- java中的Io(input与output)操作总结(一)
- GO语言的IO方法实例小结
- java中的Io(input与output)操作总结(四)
- C#路径,文件,目录及IO常见操作汇总
- php文档工具PHP Documentor安装与使用方法
- SQL语句实现查询当前数据库IO等待状况
- Java进阶教程之IO基础
- MongoDB快速入门笔记(六)之MongoDB删除文档操作
- MongoDB快速入门笔记(四)之MongoDB查询文档操作实例代码
- MongoDB快速入门笔记(三)之MongoDB插入文档操作