FFmpeg音视频播放器系列(开篇)

简介

学习FFmpeg已经有一段时间了,都是断断续续、零零散散的,没有系统的总结过,为了保证学习效果,决定自己写一个音视频播放器,借着这个项目对FFmpeg进行系统的学习与总结,争取对FFmpeg达到熟练应用的程度。
FFmpeg音视频播放器系列,本着循序渐进的过程,先从最简单的开始,逐步深入到使用QT写出一个带有GUI界面的应用软件。这个项目估计要耗时很长,但愿自己能坚持下来。
先对这个项目确定一个小目标吧:
1、模仿市面上的播放器界面使用QT完成GUI
2、可以选择单独播放视频或者音频
3、可以播放网络视频流
4、可以录制音频与视频
5、可以播放摄像头视频
好了,就这么多,多了怕自己完成不了。
自己的开发平台如下:
Ubuntu16.04
FFmpeg:4.0.2
SDL2:2.0.8
QT:5.12.1

FFmpeg的学习我基本上是基于雷神的博客,再次他致敬!他的FFmpeg博客地址在此先行贴出:
https://blog.csdn.net/leixiaohua1020/column/info/ffmpeg-devel

FFMPEG+SDL的视频播放器

雷神也有这篇博客,不过他是将视频与音频分开的,带有音频的视频在播放时,只能播放视频而没有声音,因此本篇就先进行一下综合,写出一个基于FFMPEG+SDL的简单视频播放器,可以同时播放音频与视频,可能会有音视频播放同步的问题,待到下一篇进行总结与说明。

代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define __STDC_CONSTANT_MACROS

//Linux...
#ifdef __cplusplus
extern "C"
{
   
#endif
#include <libavutil/time.h>
#include <libavutil/imgutils.h>
#include <libavutil/mathematics.h>
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libavdevice/avdevice.h>
#include <libswscale/swscale.h>
#include <libswresample/swresample.h>
#include <SDL2/SDL.h>
#ifdef __cplusplus
};
#endif


#define MAX_AUDIO_FRAME_SIZE 192000 // 1 second of 48khz 32bit audio

static  Uint8  *audio_chunk;
static  Sint32  audio_len;
static  Uint8  *audio_pos;


//Refresh Event
#define SFM_REFRESH_VIDEO_EVENT  	(SDL_USEREVENT + 1)
#define SFM_REFRESH_AUDIO_EVENT  	(SDL_USEREVENT + 2)
#define SFM_BREAK_EVENT  			(SDL_USEREVENT + 3)

int thread_exit=0;
int thread_pause=0;

int sfp_refresh_thread(void *opaque){
   
	thread_exit=0;
	thread_pause=0;

	while (!thread_exit)
	{
   
		if(!thread_pause)
		{
   
			SDL_Event event;
			event.type = SFM_REFRESH_VIDEO_EVENT;
			SDL_PushEvent(&event);
		}
		SDL_Delay(40);
	}
	thread_exit=0;
	thread_pause=0;
	//Break
	SDL_Event event;
	event.type = SFM_BREAK_EVENT;
	SDL_PushEvent(&event);

	return 0;
}

/* The audio function callback takes the following parameters:
 * stream: A pointer to the audio buffer to be filled
 * len: The length (in bytes) of the audio buffer
*/
void  fill_audio(void *udata,Uint8 *stream,int len){
   
	//SDL 2.0
	SDL_memset(stream, 0, len);
	if(audio_len==0)
		return;

	len=(len>audio_len?audio_len:len);	/*  Mix  as  much  data  as  possible  */

	SDL_MixAudio(stream, audio_pos, len, SDL_MIX_MAXVOLUME);
	audio_pos += len;
	audio_len -= len;
}



int main(int argc, char* argv[])
{
   
	AVFormatContext	*pFormatCtx;
	AVCodecContext	*pVideoCodecCtx, *pAudioCodecCtx;
	AVCodec			*pVideoCodec, *pAudioCodec;
	AVFrame			*pVideoFrame,*pAudioFrame,*pFrameYUV;
	unsigned char 	*pVideoOutBuffer, *pAudioOutBuffer;
	//AVPacket 		*pVideoPacket, *pAudioPacket;
	AVPacket 		*Packet;
	int 			i, ret, GotVideoPicture
qt ffmpeg是一款基于Qt框架和FFmpeg库开发的视频播放器。Qt是一种跨平台的应用程序开发框架,它提供了丰富的图形界面和多媒体功能的支持,使得开发者可以快速开发出功能强大、界面友好的应用程序。而FFmpeg是一种强大的开源多媒体框架,它可以处理频和视频文件的编码、解码、转码等操作。 在qt ffmpeg视频播放器中,通过集成Qt框架和FFmpeg库,我们可以实现以下功能:首先,播放各种格式的频和视频文件,包括常见的MP3、MP4、AVI等格式,同时支持流媒体的播放。其次,提供播放控制功能,如暂停、播放、快进、快退等,使用户可以方便地操作视频内容。此外,还可以实现视频文件的截图功能,将当前画面保存为图片文件。 对于开发者而言,使用qt ffmpeg视频播放器可以大大简化开发流程,因为Qt框架提供了丰富的图形界面组件和多媒体处理功能,开发者无需从零开始编写播放器的各种功能,只需进行简单的集成和配置即可。而FFmpeg库提供了强大的视频处理能力,可以方便地实现各种编码、解码、转码等操作。 对于用户而言,qt ffmpeg视频播放器提供了良好的用户体验。通过友好的界面和丰富的功能,用户可以方便地播放各种格式的视频文件,同时还可以对视频内容进行自定义设置和调整。因此,qt ffmpeg视频播放器在知乎等社区中也受到了一些开发者和用户的关注和讨论。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值