1.媒体文件播放总体过程

媒体文件——>解复用——>解码——>调用播放接口——>播放

2.解复用

2.1 什么是解复用?

解复用:将媒体文件分解为视频流和音频流

avformat_open_input() /*打开对应的文件,查找对应的解复用器,flv解复用规则最简单*/

解复用之后的视频流,音频流放在AVPacket的结构体中。

2.2 解复用相关函数

2.3 解复用流程

3.解码

解码:将视频流和音频流转化为视频帧和音频帧。

4.调用播放接口

5.实际操作

  1. 配置开发环境
    将编译好的ffmpeg动态库中的动态库文件(.so(dll)以及lib)复制到创建好的项目文件夹中,并修改配置文件。

  2. 主函数代码

#include <stdio.h>
#include "libavformat/avformat.h"  /*解复用器的库*/
#include "libavcodec/avcodec.h"
#include "SDL.h"L                  /*可能不用*//*
播放视频的代码流程
1 打开文件
2 查找视频流成分
3 读取视频包
4 解码视频包
5 播放解码后的视频
*/
int g_quit = 0;
int main(int argc, char *argv[])
{printf("open file:%s!\n", argv[1]);int ret = 0;AVFormatContext *pFormatCtx = NULL;/*分配解复用器的上下文*/pFormatCtx = avformat_alloc_context();/*打开媒体文件*/ret = avformat_open_input(&pFormatCtx, argv[1], NULL, NULL);if(ret < 0) {printf("avformat_open_input %s failed\n", argv[1]);return -1;}/*获取码流信息*/ret = avformat_find_stream_info(pFormatCtx, NULL);if(ret < 0) {printf("avformat_find_stream_info %s failed\n", argv[1]);return -1;}/*获取音频流和视频流索引,一般视频流索引是0,音频流索引是1*/int video_index = av_find_best_stream(pFormatCtx, AVMEDIA_TYPE_VIDEO, -1, -1, NULL, 0);if(video_index < 0) {printf("av_find_best_stream %s failed\n", argv[1]);return -1;}int audio_index = av_find_best_stream(pFormatCtx, AVMEDIA_TYPE_AUDIO, -1, -1, NULL, 0);if(audio_index < 0) {printf("av_find_best_stream %s failed\n", argv[1]);return -1;}/*查找解码器上下文*/AVCodecContext *pCodecCtx = avcodec_alloc_context3(NULL);if(!pCodecCtx) {printf("avcodec_alloc_context3 %s failed\n", argv[1]);return -1;}/*拷贝解码器参数*/ret = avcodec_parameters_to_context(pCodecCtx, pFormatCtx->streams[video_index]->codecpar);if(ret < 0) {printf("avcodec_parameters_to_context %s failed\n", argv[1]);return -1;}/*查找解码器*/AVCodec *pCodec = avcodec_find_decoder(pCodecCtx->codec_id);if(!pCodec) {printf("avcodec_find_decoder %d failed\n", pCodecCtx->codec_id);return -1;}/*打开解码器,将解码器和解码器上下文关联*/ret = avcodec_open2(pCodecCtx, pCodec, NULL);if(ret < 0) {printf("avcodec_open2 %s failed\n", argv[1]);return -1;}/*查看文件信息*//*av_dump_format(pFormatCtx, 0, argv[1], NULL);*//*分配一个AVPacket*/AVPacket *pkt = av_packet_alloc();/*pkt初始化*/av_init_packet(pkt);/*分配一个AVFrame*/AVFrame *frame = av_frame_alloc();while(g_quit != 1) {/*读取音视频包*/ret = av_read_frame(pFormatCtx, pkt);if(ret < 0) {printf("read end of\n");break;}/*通过索引判断音频流和视频流*/if(pkt->stream_index == video_index) {/*解码*//*发送原始视频流包去解码*/ret = avcodec_send_packet(pCodecCtx, pkt);if(ret != 0) {printf("avcodec_send_packet ret:%d\n", ret);}/*获取解码后的视频帧*/ret = avcodec_receive_frame(pCodecCtx, frame);if(ret != 0) {printf("avcodec_send_packet ret:%d\n", ret);}/*将视频帧播放,这个部分是根据sdl写的*/if(ret == 0) {}}else if(pkt->stream_index == audio_index) {}else {printf("read unkown packet\n");}/*释放包内存*/av_packet_unref(pkt);}

ffmpeg——简单播放器代码相关推荐

  1. 基于libvlc和wxWidgets的简单播放器代码阅读

    源代码来自 http://git.videolan.org/?p=vlc.git;a=blob_plain;f=doc/libvlc/wx_player.cpp // g++ wx_player.cp ...

  2. 学习开源播放器代码解析之参数设置

    1.前言   出于学习音视频的目的,在Github找了个基于FFMPEG的播放器代码,代码量比较小.地址:fflayer.于是乎下载编译了下,运行结果良好.So,出于学习的目的,写写学习笔记,归纳归纳 ...

  3. VB简单播放器与python文字语音朗读

    1.VB简单播放器代码 之前在某度知道上看到的一个问题 回答了一下.代码如下: 用WindowsMediaPlayer1控件和Drive dir file做了一个简单的播放器.你可以美化界面和优化代码 ...

  4. 如何用FFmpeg编写一个简单播放器详细步骤介绍

    如何用FFmpeg编写一个简单播放器详细步骤介绍(转载) FFMPEG是一个很好的库,可以用来创建视频应用或者生成特定的工具.FFMPEG几乎为你把所有的繁重工作都做了,比如解码.编码.复用和解复用. ...

  5. 基于Ffmpeg解码器的简单播放器(a simple audio player based on Ffmpeg)

    这是一个基于Ffmpeg解码器的简单播放器,怎么在Windows上编译Ffmpeg可以在网上找到很多,开发环境是Windows XP SP3+VS2008,其中DirectSound控制单元来自jdk ...

  6. jsp网页嵌入PHP网页,JSP_(jsp/html)网页上嵌入播放器(常用播放器代码整理),这个其实很简单,只要在HTML上 - phpStudy...

    (jsp/html)网页上嵌入播放器(常用播放器代码整理) 这个其实很简单,只要在HTML上添加以上代码就OK了,前提是你的电脑上已经安装了播放器,如RealPlay. 还有更多的的播放器和设置可供选 ...

  7. python控制视频播放器的大小与位置_python_十几行代码实现简单播放器

    python20行代码实现简单播放器 播放器简介 播放器大家都并不陌生,我们听音乐,我们看视频都会用到.那么播放器实现的功能到底有哪些呢?一个播放器一般来讲都完成了如下步骤: 读取文件(包括音频文件和 ...

  8. python开发视频播放器_python_十几行代码实现简单播放器

    python20行代码实现简单播放器 播放器简介 播放器大家都并不陌生,我们听音乐,我们看视频都会用到.那么播放器实现的功能到底有哪些呢?一个播放器一般来讲都完成了如下步骤: 读取文件(包括音频文件和 ...

  9. 如何用 FFmpeg 编写一个简单播放器.pdf

    An ffmpeg and SDL Tutorial.pdf 如何用 FFmpeg 编写一个简单播放器.pdf 中文版

最新文章

  1. ubuntu dpkg initramfs-tools错误的解决方法
  2. 传感器应用的demo自动录音器
  3. kindle可以设置24小时吗_华为怎么设置时间24小时
  4. Idea 依赖冲突一分钟解决2种方案
  5. UC伯克利造出会「轻功」的机器人,飞檐走壁,一条腿跳遍天下|湾区人工智能...
  6. CCF201503-2 数字排序(100分)
  7. android 关闭jack_安卓编译 Jack server 错误问题解决办法
  8. spring mybatis 项目源码
  9. Django自定义过滤器
  10. python实现九九乘法表代码解释_python编写九九乘法表代码
  11. 使用Struts之ActionForm
  12. 网络层 详解,网络层功能,网络层协议,网络层设备。
  13. 收集的vue各种库,UI库等
  14. 3d全息投影技术在教学中有什么好处
  15. Qt 串口数据采集并绘图
  16. pythonweb数据可视化_独家 | 基于Python实现交互式数据可视化的工具(用于Web)
  17. 忠诚度管理软件市场分析-主要企业、产品类别及应用
  18. axios如何解决跨域的方案
  19. 鹅厂女专家:用“爱折腾”实现跨界之美
  20. 使用PyLint分析评估代码质量

热门文章

  1. 几种免费的界面库及其用法(转)
  2. C语言小程序——调用系统应用
  3. 服务器2003蓝屏A5修复,重装Win7系统开机蓝屏错误代码0X000000a5的修复方案
  4. cookieJsp购物车
  5. lcd12864使用c语言pic单片机,PIC单片机+LCD12864显示汉字程序
  6. 学员故事:老男孩Linux运维班学习五个月,让我实现月薪万元+
  7. 巧用ASP实现Web数据统计、报表和打印 (转)
  8. 公式符号类型pdf转word为什么乱码了,怎么调整?
  9. 魔方二阶玩法[图解]
  10. java新手练习项目_有哪些好的java项目适合新手练习?