2013-05-17 10:03 4713人阅读 评论(1) 收藏 举报
 分类:
ffmpeg(3) 
这个FFMPEG我没找到详细的中文教程,只有将自己的使用心得记录。

1 int avpicture_fill(AVPicture *picture, uint8_t *ptr,
                   int pix_fmt, int width, int height);
这个函数的使用本质上是为已经分配的空间的结构体AVPicture挂上一段用于保存数据的空间,这个结构体中有一个指针数组data[4],挂在这个数组里。一般我们这么使用:
1) pFrameRGB=avcodec_alloc_frame();
2) numBytes=avpicture_get_size(PIX_FMT_RGB24, pCodecCtx->width,pCodecCtx->height);
    buffer=(uint8_t *)av_malloc(numBytes*sizeof(uint8_t));
3) avpicture_fill((AVPicture *)pFrameRGB, buffer, PIX_FMT_RGB24,pCodecCtx->width, pCodecCtx-         >height);
以上就是为pFrameRGB挂上buffer。这个buffer是用于存缓冲数据的。
好,现在让我们来看一下tutorials里常出现的pFrame为什么不用fill空间。主要是下面这句:
avcodec_decode_video(pCodecCtx, pFrame, &frameFinished,packet.data, packet.size);
这里根据我的瞎猜,很可能是pFrame已经挂上了packet.data,所以就不用fill了。
2 现在开始谈ffmpeg里的一些设备上下文,关于设备上下文,回顾一下它的定义:
Windows操作系统统一管理着诸如显示,打印等操作,将它们看作是一个个的设备,每一个设备都有一个复杂的数据结构来维护。所谓设备上下文就是指这个数据结构。然而,我们不能直接和这些设备上下文打交道,只能通过引用标识它的句柄(实际上是一个整数),让Windows去做相应的处理。
 
ffmpeg的两个设备上下文AVFormatContext和AVCodecContext,实际上是可以直接对其进行操作的。
AVFormatContext是FFMpeg格式转换过程中实现输入和输出功能、保存相关数据的主要结构。
AVCodecContext保存AVCodec指针和与codec相关的数据,如video的width、height,audio的sample rate等。
这里一些重要的数据结构可以参看:
实际上AVCodecContext里的stream结构体中包含了一个AVCodecContext。所以码流对应的codec可以从这里取出。
 
3 用SDL_SetVideoMode创建一个且仅有一个的screen surface,相当于屏幕了,所有东西都往上画
 
4 struct SwsContext *sws_getContext
(int srcW, int srcH, int srcFormat, int dstW, int dstH, int dstFormat, int 
flags,SwsFilter *srcFilter, SwsFilter *dstFilter, double *param);
获取用于转换在上下文,这里转换的概念包括视频的大小,像素格式。但这里只是获取了DC未开始转换
 
5 int sws_scale
(struct SwsContext *context, uint8_t* src[], int srcStride[], int srcSliceY,
 int srcSliceH, uint8_t* dst[], int dstStride[]);
开始向目标转换,转换后可以用于显示,但转换之前必须指定dst的地址和行数,这样才知道数据以何种方式copy到dst中去。
 
6 关于声音,由于计算机方面知识比较单薄,故复习了一下队列多线程互斥体条件变量等概念,耽误了不少时间。
1)首先要给wanted_spec设置一堆声音播放的参数,其中最重要的就是控制播放速度的采样率和回调函数,接着fill给spec,这个spec猜测就是声卡。
2)初始化队列,开始播放声音同时开启callback。这些都是关于声音解码器的工作,在读入文件info后做完。 
3)接下来是读码流了,若是声音的码流,则执行packet_queue_put(&audioq, &packet),将直接将包放入队   列,同时发送条件变量通知packet_queue_get已经有数据了
4)现在来分析一直在进行中的回调函数audio_callback,这里面会调用audio_decode_frame,进入后是一个无限循环,顺序应是先执行packet_queue_get,待得到数据后再执行avcodec_decode_audio2解码
5)在packet_queue_get中将先上锁,等待packet_queue_put的通知(其间将解锁,睡眠,得到通知再上锁),后再解锁,上锁解锁是为了防止put和get同时操作队列

ffmpeg avpicture_fill的一些使用的更多相关文章

  1. C#音视频网络流解码:H264视频和ACC音频

    下面两种方式是直接翻译过来的,还有问题,比如指针的使用和值的传入.考虑C#和C++的差异,还是要抱着怀疑的态度去看待,不一定是对的. H264视频解码网络流: using FFmpeg.AutoGen ...

  2. FFmpeg学习5:多线程播放视音频

    在前面的学习中,视频和音频的播放是分开进行的.这主要是为了学习的方便,经过一段时间的学习,对FFmpeg的也有了一定的了解,本文就介绍了 如何使用多线程同时播放音频和视频(未实现同步),并对前面的学习 ...

  3. FFmpeg学习2:解码数据结构及函数总结

    在上一篇文章中,对FFmpeg的视频解码过程做了一个总结.由于才接触FFmpeg,还是挺陌生的,这里就解码过程再做一个总结. 本文的总结分为以下两个部分: 数据读取,主要关注在解码过程中所用到的FFm ...

  4. ffmpeg 和 SDL 的结合使用

    FFmpeg是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源计算机程序.采用LGPL或GPL许可证.它提供了录制.转换以及流化音视 频的完整解决方案.它包含了非常先进的音频/视频编解码库 ...

  5. 学习FFmpeg API

    ffmpeg是编解码的利器,用了很久,以前看过dranger 的教程,非常精彩,受益颇多,是学习ffmpeg api很好的材料.可惜的是其针对的ffmpeg版本已经比较老了,而ffmpeg的更新又很快 ...

  6. ffmpeg从AVFrame取出yuv数据到保存到char*中

    ffmpeg从AVFrame取出yuv数据到保存到char*中   很多人一直不知道怎么利用ffmpeg从AVFrame取出yuv数据到保存到char*中,下面代码将yuv420p和yuv422p的数 ...

  7. [原]如何在Android用FFmpeg+SDL2.0解码图像线程

    关于如何在Android上用FFmpeg+SDL2.0解码显示图像参考[原]如何在Android用FFmpeg+SDL2.0解码显示图像 ,关于如何在Android使用FFmpeg+SDL2.0解码声 ...

  8. [原]如何在Android用FFmpeg+SDL2.0解码声音

    关于如何在Android上用FFmpeg+SDL2.0解码显示图像参考[原]如何在Android用FFmpeg+SDL2.0解码显示图像 ,本文是基于上述文章和[原]零基础学习视频解码之解码声音 来移 ...

  9. [原]如何在Android用FFmpeg+SDL2.0解码显示图像

    如何在Android上使用FFmpeg解码图像参考文章[原]如何在Android用FFmpeg解码图像 ,如何在Android上使用SDL2.0来显示图像参考[原]零基础学习SDL开发之在Androi ...

随机推荐

  1. 安装Hadoop 1.1.2 (二 安装配置SSH)

    1 查找SSH  yum search ssh 2 如果没有安装, yum install openssh.x86_64 4 直接运行  ssh-keygen -t dsa -P '' -f /roo ...

  2. mysql中的乐观锁和悲观锁

    mysql中的乐观锁和悲观锁的简介以及如何简单运用. 关于mysql中的乐观锁和悲观锁面试的时候被问到的概率还是比较大的. mysql的悲观锁: 其实理解起来非常简单,当数据被外界修改持保守态度,包括 ...

  3. 【python】-- MySQL简介、安装、操作

    MySQL简介.安装.操作 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据.我们也可以将数据存储 ...

  4. Symfony 安装FOUSerBundle

    第一按照官网安装 : https://symfony.com/doc/current/bundles/FOSUserBundle/index.html#main 可能版本无法安装 : $ compos ...

  5. Openstack 架构简述

    概述 在学习OpenStack的过程中,感觉对整个OpenStack的架构稍稍有些了解,所以将这些记录下来,一来防止自己忘记,二来也可以对有需要的人提供帮助 本文章相关的灵感/说明/图片来自于http ...

  6. 中国移动OnetNet云平台 使用以太网传输数据流步骤

    使用工具: 网络调试助手 链接:http://pan.baidu.com/s/1c06VC9E 密码:h0ys 1.选择TCP Client 2.输入IP   183.230.40.33 3.输入端口 ...

  7. python基础14 ---函数模块5(模块和包)

    模块与包 一.模块 1.模块是怎么诞生的. 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护.为了编写可维护的代码,我们把很多函数分组,分别放到 不同的文 ...

  8. python+selenium多窗口之间切换

    #!/usr/bin/env python # coding:utf8 # author:Z time:2018/9/19 import time from selenium import webdr ...

  9. mysql查询当天,本周,本月,上一个月的数据(转)

    今天 select * from 表名 where to_days(时间字段名) = to_days(now()); 昨天 SELECT * FROM 表名 WHERE TO_DAYS( NOW( ) ...

  10. Spark Structured Streaming框架(1)之基本用法

     Spark Struntured Streaming是Spark 2.1.0版本后新增加的流计算引擎,本博将通过几篇博文详细介绍这个框架.这篇是介绍Spark Structured Streamin ...