• 大小: 14.15MB
    文件类型: .zip
    金币: 2
    下载: 0 次
    发布日期: 2024-01-21
  • 语言: 其他
  • 标签: ffmpeg  ffplay  

资源简介

环境:Vs2010 参考网址:http://blog.csdn.net/cffishappy/article/details/7352898 鉴于ffplay的代码晦涩难懂 结合ffplay的代码 自己实现了一个ffplay 比较精简和通俗易懂 未解决的问题: 1、停止后会有崩溃(应该是释放ffmpeg对象时未退出线程造成内存访问错误 demo就不改了) 2、不支持手动点击界面以跳转进度,不过在代码里实现了跳转接口的测试 3、未处理SDL窗口的消息循环 预览窗口不能拖动 且偶尔播放久了后界面未见刷新-测试定位应该是SDL的问题 因为之后解码的AVFrame保存的图片均正常 不予解决

资源截图

代码片段和文件信息

#include “base.h“
#include 

BOOL req_seek = FALSE;
AVFormatContext* g_pFormatCtx = NULL;

int g_videoStream = -1;
int g_audioStream = -1;

AVStream* g_pVideoStream = NULL;
AVStream* g_pAudioStream = NULL;

AVCodecContext* g_pCodecCtx = NULL;
AVCodecContext* g_aCodecCtx = NULL;

AVCodec* g_pCodec = NULL;
AVCodec* g_aCodec = NULL;

BOOL  g_bStartPlay = FALSE;
DWORD g_dwStartPlayTime = 0;

BOOL g_bAudioInit = FALSE;
CRITICAL_SECTION g_csAudioList;
vector g_vAudioList; // 读取到的音频包
tMyAudioParams  g_tAudioDstParams; // 播放音频的格式
int  curAudioSamples = 0; // 获取到一个新的包时 清零该值

CRITICAL_SECTION g_csVideoList;
vector g_vVideoList; // 读取到的视频包
SDL_Overlay* g_bmp = NULL;
struct SwsContext* g_pImgConvertCtx = NULL;

int init_ffmpeg(const char* pFileName)
{
av_register_all();

if(avformat_open_input(&g_pFormatCtx pFileName NULL NULL) != 0)
{
printf(“avformat_open_input  fail to open file:%s \n“ pFileName);
return -1;
}

if(avformat_find_stream_info(g_pFormatCtx NULL) < 0)
{
printf(“avformat_find_stream_info  fail to find stream \n“);
return -1; // Couldn‘t find stream information
}

for(int i=0; i < g_pFormatCtx->nb_streams; i++) // find the video or audio stream index
{
if(g_pFormatCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO)
{
g_videoStream = i;
}
else if(g_pFormatCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_AUDIO)
{
g_audioStream = i;
}
if (g_videoStream >= 0 && g_audioStream >= 0)
{
break;
}
}

if((g_videoStream == -1) && (g_audioStream == -1))
{
printf(“can not find any video or audio stream \n“);
return -1;
}

if (g_videoStream >= 0)
{
g_pVideoStream = g_pFormatCtx->streams[g_videoStream];
g_pCodecCtx = g_pFormatCtx->streams[g_videoStream]->codec;
if (g_pCodecCtx) g_pCodec = avcodec_find_decoder(g_pCodecCtx->codec_id);
if (g_pCodec) if(avcodec_open2(g_pCodecCtx g_pCodec NULL) < 0) return -1; // Could not open codec
}

if (g_audioStream >= 0)
{
g_pAudioStream = g_pFormatCtx->streams[g_audioStream];
g_aCodecCtx = g_pFormatCtx->streams[g_audioStream]->codec;
if (g_aCodecCtx)  g_aCodec = avcodec_find_decoder(g_aCodecCtx->codec_id);
if (g_aCodec) if(avcodec_open2(g_aCodecCtx g_aCodec NULL) < 0) return -1; // Could not open codec
}

return 0;
}

int init_sdl()
{
if (g_pCodecCtx) // SDL-video show init
{  
if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER))
{
return -2;
}

SDL_Surface* screen = SDL_SetVideoMode(g_pCodecCtx->width g_pCodecCtx->height 0 0);
if(!screen) 
{
return -2;
}

g_pImgConvertCtx = sws_getContext(g_pCodecCtx->width g_pCodecCtx->height
 g_pCodecCtx->pix_fmt g_pCodecCtx->width g_pCodecCtx->height
 AV_PIX_FMT_YUV420P SWS_BICUBIC
 NULL NULL NULL);

g_bmp = SDL_CreateYUVOverlay(g_pCodecCtx->width g_pCodecCtx->height SDL_YV12_OVERLAY screen);
}


 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2015-08-14 15:03  ffmpeg  wsh\
     文件         294  2015-05-11 10:05  ffmpeg  wsh\clean.bat
     目录           0  2015-08-14 15:03  ffmpeg  wsh\Debug\
     文件          48  2015-08-14 14:13  ffmpeg  wsh\Debug\Copy.bat
     目录           0  2015-08-14 14:11  ffmpeg  wsh\demos\
     目录           0  2015-08-14 15:03  ffmpeg  wsh\demos\ffplay\
     文件       10756  2015-08-14 15:00  ffmpeg  wsh\demos\ffplay\base.cpp
     文件        2686  2015-08-14 09:40  ffmpeg  wsh\demos\ffplay\base.h
     文件        4993  2015-08-14 14:15  ffmpeg  wsh\demos\ffplay\ffplay.vcxproj
     文件        5787  2015-08-14 15:02  ffmpeg  wsh\demos\ffplay\main.cpp
     文件         891  2015-08-13 16:41  ffmpeg  wsh\myFFplay.sln
     目录           0  2015-08-14 15:03  ffmpeg  wsh\Release\
     文件          48  2015-08-14 14:13  ffmpeg  wsh\Release\Copy.bat
     目录           0  2015-08-14 14:11  ffmpeg  wsh\sdk\
     目录           0  2015-08-14 14:11  ffmpeg  wsh\sdk\bin\
     文件    22371840  2015-06-10 10:06  ffmpeg  wsh\sdk\bin\avcodec-56.dll
     文件     1380352  2015-06-10 10:06  ffmpeg  wsh\sdk\bin\avdevice-56.dll
     文件     2392576  2015-06-10 10:06  ffmpeg  wsh\sdk\bin\avfilter-5.dll
     文件     6012928  2015-06-10 10:06  ffmpeg  wsh\sdk\bin\avformat-56.dll
     文件      493568  2015-06-10 10:06  ffmpeg  wsh\sdk\bin\avutil-54.dll
     文件      330752  2015-06-10 10:06  ffmpeg  wsh\sdk\bin\ffmpeg_org.exe
     文件      476160  2015-06-10 10:06  ffmpeg  wsh\sdk\bin\ffplay_org.exe
     文件      155648  2015-06-10 10:06  ffmpeg  wsh\sdk\bin\ffprobe_org.exe
     文件      131584  2015-06-10 10:06  ffmpeg  wsh\sdk\bin\postproc-53.dll
     文件      281600  2015-06-10 10:06  ffmpeg  wsh\sdk\bin\swresample-1.dll
     文件      452608  2015-06-10 10:06  ffmpeg  wsh\sdk\bin\swscale-3.dll
     目录           0  2015-08-14 14:11  ffmpeg  wsh\sdk\include\
     文件        7875  2015-02-05 09:21  ffmpeg  wsh\sdk\include\inttypes.h
     目录           0  2015-08-14 14:11  ffmpeg  wsh\sdk\include\libavcodec\
     文件      181963  2015-06-10 10:06  ffmpeg  wsh\sdk\include\libavcodec\avcodec.h
     文件        3111  2015-06-10 10:06  ffmpeg  wsh\sdk\include\libavcodec\avfft.h
............此处省略157个文件信息

评论

共有 条评论