ffmpeg——简单播放器代码
1.媒体文件播放总体过程
媒体文件——>解复用——>解码——>调用播放接口——>播放
2.解复用
2.1 什么是解复用?
解复用:将媒体文件分解为视频流和音频流
avformat_open_input() /*打开对应的文件,查找对应的解复用器,flv解复用规则最简单*/
解复用之后的视频流,音频流放在AVPacket的结构体中。
2.2 解复用相关函数
2.3 解复用流程
3.解码
解码:将视频流和音频流转化为视频帧和音频帧。
4.调用播放接口
5.实际操作
配置开发环境
将编译好的ffmpeg动态库中的动态库文件(.so(dll)以及lib)复制到创建好的项目文件夹中,并修改配置文件。主函数代码
#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——简单播放器代码相关推荐
- 基于libvlc和wxWidgets的简单播放器代码阅读
源代码来自 http://git.videolan.org/?p=vlc.git;a=blob_plain;f=doc/libvlc/wx_player.cpp // g++ wx_player.cp ...
- 学习开源播放器代码解析之参数设置
1.前言 出于学习音视频的目的,在Github找了个基于FFMPEG的播放器代码,代码量比较小.地址:fflayer.于是乎下载编译了下,运行结果良好.So,出于学习的目的,写写学习笔记,归纳归纳 ...
- VB简单播放器与python文字语音朗读
1.VB简单播放器代码 之前在某度知道上看到的一个问题 回答了一下.代码如下: 用WindowsMediaPlayer1控件和Drive dir file做了一个简单的播放器.你可以美化界面和优化代码 ...
- 如何用FFmpeg编写一个简单播放器详细步骤介绍
如何用FFmpeg编写一个简单播放器详细步骤介绍(转载) FFMPEG是一个很好的库,可以用来创建视频应用或者生成特定的工具.FFMPEG几乎为你把所有的繁重工作都做了,比如解码.编码.复用和解复用. ...
- 基于Ffmpeg解码器的简单播放器(a simple audio player based on Ffmpeg)
这是一个基于Ffmpeg解码器的简单播放器,怎么在Windows上编译Ffmpeg可以在网上找到很多,开发环境是Windows XP SP3+VS2008,其中DirectSound控制单元来自jdk ...
- jsp网页嵌入PHP网页,JSP_(jsp/html)网页上嵌入播放器(常用播放器代码整理),这个其实很简单,只要在HTML上 - phpStudy...
(jsp/html)网页上嵌入播放器(常用播放器代码整理) 这个其实很简单,只要在HTML上添加以上代码就OK了,前提是你的电脑上已经安装了播放器,如RealPlay. 还有更多的的播放器和设置可供选 ...
- python控制视频播放器的大小与位置_python_十几行代码实现简单播放器
python20行代码实现简单播放器 播放器简介 播放器大家都并不陌生,我们听音乐,我们看视频都会用到.那么播放器实现的功能到底有哪些呢?一个播放器一般来讲都完成了如下步骤: 读取文件(包括音频文件和 ...
- python开发视频播放器_python_十几行代码实现简单播放器
python20行代码实现简单播放器 播放器简介 播放器大家都并不陌生,我们听音乐,我们看视频都会用到.那么播放器实现的功能到底有哪些呢?一个播放器一般来讲都完成了如下步骤: 读取文件(包括音频文件和 ...
- 如何用 FFmpeg 编写一个简单播放器.pdf
An ffmpeg and SDL Tutorial.pdf 如何用 FFmpeg 编写一个简单播放器.pdf 中文版
最新文章
- ubuntu dpkg initramfs-tools错误的解决方法
- 传感器应用的demo自动录音器
- kindle可以设置24小时吗_华为怎么设置时间24小时
- Idea 依赖冲突一分钟解决2种方案
- UC伯克利造出会「轻功」的机器人,飞檐走壁,一条腿跳遍天下|湾区人工智能...
- CCF201503-2 数字排序(100分)
- android 关闭jack_安卓编译 Jack server 错误问题解决办法
- spring mybatis 项目源码
- Django自定义过滤器
- python实现九九乘法表代码解释_python编写九九乘法表代码
- 使用Struts之ActionForm
- 网络层 详解,网络层功能,网络层协议,网络层设备。
- 收集的vue各种库,UI库等
- 3d全息投影技术在教学中有什么好处
- Qt 串口数据采集并绘图
- pythonweb数据可视化_独家 | 基于Python实现交互式数据可视化的工具(用于Web)
- 忠诚度管理软件市场分析-主要企业、产品类别及应用
- axios如何解决跨域的方案
- 鹅厂女专家:用“爱折腾”实现跨界之美
- 使用PyLint分析评估代码质量
热门文章
- 几种免费的界面库及其用法(转)
- C语言小程序——调用系统应用
- 服务器2003蓝屏A5修复,重装Win7系统开机蓝屏错误代码0X000000a5的修复方案
- cookieJsp购物车
- lcd12864使用c语言pic单片机,PIC单片机+LCD12864显示汉字程序
- 学员故事:老男孩Linux运维班学习五个月,让我实现月薪万元+
- 巧用ASP实现Web数据统计、报表和打印 (转)
- 公式符号类型pdf转word为什么乱码了,怎么调整?
- 魔方二阶玩法[图解]
- java新手练习项目_有哪些好的java项目适合新手练习?