ffmpeg入门
总入口
http://blog.csdn.net/leixiaohua1020/article/details/15811977
各结构体介绍
http://blog.csdn.net/leixiaohua1020/article/details/14215833
简单的ffmpeg+sdl例子视频教学
http://blog.csdn.net/leixiaohua1020/article/details/47068015
关于解码与播放,例子是音频
http://blog.csdn.net/leixiaohua1020/article/details/46890259
ffmpeg函数调用流程
http://zhuang0393.blog.163.com/blog/static/9285104201302174532913/
/*示例代码*/
#include <stdio.h>
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libswscale/swscale.h> int main(int argc, char **argv)
{
uint8_t * out_buffer;
AVCodec *pCodec; // 表示音视频编解码器
AVFrame *pFrame; // 原始数据
AVFrame *pFrameYUV;
AVPacket packet; // 代表音视频数据帧
AVCodecContext *pCodecCtx; // 当前 Codec 使用的上下文
AVFormatContext *pFormatCtx;//当前文件容器格式使用的上下文
char filepath[] = "1.mp4";
int got_picture, videoStream, i; av_register_all(); //注册所有的编解码器,复用/解复用器等等组件。
avformat_network_init(); //网络流初始化
pFormatCtx = avformat_alloc_context(); //打开文件并读取头信息
if (avformat_open_input(&pFormatCtx,filepath,NULL,NULL) != 0){
printf("%s, %d\n", __func__, __LINE__);
return 1;
} //查找 stream info
if (avformat_find_stream_info(pFormatCtx,NULL) < 0) {
printf("%s, %d\n", __func__, __LINE__);
return 1;
} // 查找第一个视频流
videoStream = -1;
for(i = 0 ;i < pFormatCtx->nb_streams; i++ )
if (pFormatCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO)
{
videoStream = i ;
break;
}
if (videoStream == -1)
return -1; pCodecCtx = pFormatCtx ->streams[videoStream]->codec; //查找解码器
pCodec=avcodec_find_decoder(pCodecCtx->codec_id);
//打开解码器
avcodec_open2(pCodecCtx, pCodec,NULL);
pFrame=av_frame_alloc();
out_buffer=(uint8_t *)av_malloc(avpicture_get_size(AV_PIX_FMT_YUV420P, pCodecCtx->width, pCodecCtx->height)); //循环读取视频帧
while (av_read_frame(pFormatCtx, &packet) >= 0) { printf("index: %d\n", packet.stream_index); // ==videoStream则为视频帧
avcodec_decode_video2(pCodecCtx, pFrame, &got_picture, &packet); //解码一帧 //获得sws上下文句柄
struct SwsContext *img_convert_ctx = NULL;
img_convert_ctx = sws_getContext(pCodecCtx->width, pCodecCtx->height, pCodecCtx->pix_fmt,
pCodecCtx->width, pCodecCtx->height, AV_PIX_FMT_YUV420P, SWS_BICUBIC, NULL, NULL, NULL); //执行自定义转换
sws_scale(img_convert_ctx, (const uint8_t* const*)pFrame->data, pFrame->linesize, 0, pCodecCtx->height, pFrameYUV->data, pFrameYUV->linesize);
/*
这边已经得到一个yuv420p格式的AVFrame原始数据, 我们可以
1. 把数据保存成一帧一帧的图片
2. 可以用sdl库直接播放出来
*/
sws_freeContext(img_convert_ctx);
av_free_packet(&packet);
} av_frame_free(&pFrame);
avcodec_close(pCodecCtx);
avformat_close_input(&pFormatCtx);
}
ffmpeg入门的更多相关文章
- FFmpeg入门,简单播放器
一个偶然的机缘,好像要做直播相关的项目 为了筹备,前期做一些只是储备,于是开始学习ffmpeg 这是学习的第一课 做一个简单的播放器,播放视频画面帧 思路是,将视频文件解码,得到帧,然后使用定时器,1 ...
- FFmpeg 入门(7):Seeking
本文转自:FFmpeg 入门(7):Seeking | www.samirchen.com 处理 seek 命令 我们将为播放器添加 seek 的能力.这个过程中,我们会看到 av_seek_fram ...
- FFmpeg 入门(6):音频同步
本文转自:FFmpeg 入门(6):音频同步 | www.samirchen.com 音频同步 上一节我们做了将视频同步到音频时钟,这一节我们反过来,将音频同步到视频.首先,我们要实现一个视频时钟来跟 ...
- FFmpeg 入门(5):视频同步
本文转自:FFmpeg 入门(5):视频同步 | www.samirchen.com 视频如何同步 在之前的教程中,我们已经可以开始播放视频了,也已经可以开始播放音频了,但是视频和音频的播放还未同步, ...
- FFmpeg 入门(4):线程分治
本文转自:FFmpeg 入门(4):线程分治 | www.samirchen.com 概览 上一节教程中,我们使用 SDL 的音频相关的函数来支持音频播放.SDL 起了一个线程来在需要音频数据的时候去 ...
- FFmpeg 入门(2):输出视频到屏幕
本文转自:FFmpeg 入门(2):输出视频到屏幕 | www.samirchen.com SDL 我们这里使用 SDL 来渲染视频到屏幕.SDL 是 Simple Direct Layer 的缩写, ...
- FFmpeg 入门(3):播放音频
本文转自:FFmpeg 入门(3):播放音频 | www.samirchen.com 音频 SDL 提供了播放音频的方法.SDL_OpenAudio 函数用来让设备播放音频,它需要我们传入一个包含了所 ...
- FFmpeg 入门(1):截取视频帧
本文转自:FFmpeg 入门(1):截取视频帧 | www.samirchen.com 背景 在 Mac OS 上如果要运行教程中的相关代码需要先安装 FFmpeg,建议使用 brew 来安装: // ...
- FFMPEG 入门
1. 下载网站:https://ffmpeg.zeranoe.com/builds/ 先后下载 Win32 Shared 和 Win32 Dev 两个版本,分别解压缩. 2. 用Visual Stud ...
随机推荐
- [LeetCode] Remove Element (三种解法)
Given an array and a value, remove all instances of that value in place and return the new length. T ...
- golang heap container balance request
package mainimport ( "container/heap" "fmt" "log" "math/rand" ...
- jQuery实现长按按钮触发事件的方法
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- WPF之MVVM(Step2)——自己实现DelegateCommand:ICommand
在自己实现MVVM时,上一篇的实现方式基本是不用,因其对于命令的处理不够方便,没写一个命令都需要另加一个Command的类.此篇主要介绍DelegateCommand来解决上面所遇到的问题. 首先,我 ...
- 浅学JSON——Json.NET之首次试手
首次遭遇Json格式,缘由项目中用到Json数据,需要进行解析,为此,将Json数据转为了自己较为熟悉的DataTable格式,以此展示至DataGridView中,验证是否成功. 直接上代码: // ...
- 在ubuntu中安装maven
安装环境 操作系统:ubuntu 14.04.1 server amd64 安装jdk 在安装maven之前,必须确保已经安装过jdk. 安装jdk的方法请参考文章<在ubuntu中安装jdk& ...
- JS 时间格式化
Date.prototype.format = function(format){ var o = { "M+" : this.getMonth()+1, //month &quo ...
- 简单解释Windows如何使用FS段寄存器
详见附件 jpg改rar
- cocos2dx游戏开发——别踩白块学习笔记(二)——经典模式的实现
一.创建GameScene以及GameLayer 就是简单创建一个Scene而已,在此就不多说啦~,可以参照我的打飞机的学习笔记(2). 二.添加一个开始栏 很简单,就是调用Block中的create ...
- 【JS】两种计时器/定时器
1.首先介绍定时器 定时器:设置一个定时器,再设置一个等待的时间,到达指定时间后,执行对应的操作 两种定时器:用法一样,区别一个执行后不会停下来,一个只执行一次 第一种:window.setInter ...