`
he91_com
  • 浏览: 400997 次
文章分类
社区版块
存档分类
最新评论

ffmpeg + sdl -02 利用ffmpeg来分析文件信息

 
阅读更多
利用ffmpeg来分析wma文件信息


STEP1: 参考ffprobe编写如下测试代码。
fileParse.c


#include <libavformat/avformat.h>
#include <libavcodec/avcodec.h>
#include <libavutil/avstring.h>
#include <libavutil/opt.h>
#include <libavutil/pixdesc.h>
#include <libavutil/dict.h>


#define print_error(a, b) printf(" Open %s with error (%d) \n", a, b)


int dec_init()
{
av_register_all();
avformat_network_init();
}


int dec_exit()
{
avformat_network_deinit();
}


int dec_parse(const char *filename)
{
int err, i;
AVFormatContext *fmt_ctx = NULL;
AVDictionaryEntry *t;
AVInputFormat *iformat = NULL;
AVDictionary *format_opts = NULL;


if ((err = avformat_open_input(&fmt_ctx, filename, iformat, &format_opts)) < 0) {
print_error(filename, err);
return err;
}
if ((t = av_dict_get(format_opts, "", NULL, AV_DICT_IGNORE_SUFFIX))) {
av_log(NULL, AV_LOG_ERROR, "Option %s not found.\n", t->key);
return AVERROR_OPTION_NOT_FOUND;
}




/* fill the streams in the format context */
if ((err = avformat_find_stream_info(fmt_ctx, NULL)) < 0) {
print_error(filename, err);
return err;
}


av_dump_format(fmt_ctx, 0, filename, 0);


/* bind a decoder to each input stream */
for (i = 0; i < fmt_ctx->nb_streams; i++) {
AVStream *stream = fmt_ctx->streams[i];
AVCodec *codec;


if (!(codec = avcodec_find_decoder(stream->codec->codec_id))) {
fprintf(stderr, "Unsupported codec with id %d for input stream %d\n",
stream->codec->codec_id, stream->index);
} else if (avcodec_open2(stream->codec, codec, NULL) < 0) {
fprintf(stderr, "Error while opening codec for input stream %d\n",
stream->index);
}
}

avformat_close_input(&fmt_ctx);
return 0;
}


int main(int argc, char **argv)
{
dec_init();

dec_parse(argv[1]);
dec_exit();
}


Makefile文件
.PHONY: fileParse
INCLUDE= -I../ffmpeg-0.9.2/libavcodec -I../ffmpeg-0.9.2/libavformat -I../ffmpeg-0.9.2/libavfilter -I../ffmpeg-0.9.2/libavformat -I../ffmpeg-0.9.2/libswscale


fileParse:
-rm fileParse
gcc -g ${INCLUDE} -o fileParse fileParse.c -lavformat -lavcodec -lavutil -lswscale -lbz2 -lz -lm `sdl-config --cflags --libs`
chmod +x fileParse


STEP2: 使用gdb来Debug FFMPEG
1〉修改ffmpeg配置。
make clean
./configure --enable-debug --disable-optimizations --disable-yasm --disable-asm
make
make install


2> 使用gdb 来调试fileParse
为了了解ffmpeg流程,用wma来测试。
注意到wma采用asf封装,猜测格式检测函数是asf_probe
文件:libavformat/Asfdec.c
.read_probe = asf_probe


gdb
file fileParse
b asf_probe
r /projects/media/wma/123.wma (测试文件路径)
bt


#0 asf_probe (pd=0xbffff12c) at libavformat/asfdec.c:139
#1 0x0812a2a3 in av_probe_input_format3 (pd=0xbffff1c0, is_opened=1,
score_ret=0xbffff178) at libavformat/utils.c:351
#2 0x0812a384 in av_probe_input_format2 (pd=0xbffff1c0, is_opened=1,
score_max=0xbffff1bc) at libavformat/utils.c:373
#3 0x0812aae5 in av_probe_input_buffer (pb=0x8c375d0, fmt=0x8c2f024,
filename=0xbffff548 "/projects/media/wma/123.wma", logctx=0x8c2f020,
offset=0, max_probe_size=1048576) at libavformat/utils.c:586
#4 0x0812add6 in init_input (s=0x8c2f020,
filename=0xbffff548 "/projects/media/wma/123.wma", options=0xbffff24c)
at libavformat/utils.c:653
#5 0x0812ae90 in avformat_open_input (ps=0xbffff2a4,
filename=0xbffff548 "/projects/media/wma/123.wma", fmt=0x0,
options=0xbffff2a0) at libavformat/utils.c:674
#6 0x0804a48f in dec_parse (filename=0xbffff548 "/projects/media/wma/123.wma")
at fileParse.c:29
#7 0x0804a66d in main (argc=2, argv=0xbffff394) at fileParse.c:69


可见ffmpeg的调用关系如下:
avformat_open_input

init_input
  ↓
av_probe_input_buffer
  ↓
av_probe_input_format2
  ↓
av_probe_input_format3
  ↓


while ((fmt1 = av_iformat_next(fmt1))) {
if (!is_opened == !(fmt1->flags & AVFMT_NOFILE))
continue;
score = 0;
if (fmt1->read_probe) {
score = fmt1->read_probe(&lpd);
if(fmt1->extensions && av_match_ext(lpd.filename, fmt1->extensions))
score = FFMAX(score, nodat ? AVPROBE_SCORE_MAX/4-1 : 1);
} else if (fmt1->extensions) {
if (av_match_ext(lpd.filename, fmt1->extensions)) {
score = 50;
}
}
if (score > score_max) {
score_max = score;
fmt = fmt1;
}else if (score == score_max)
fmt = NULL;
}


评分算法:
1〉文件头检查OK, 直接打100分
2〉文件后缀匹配,直接打50分


av_iformat_next遍历的链表信息主要在av_register_all中调用REGISTER_MUXER宏来
注册。


同样
b asf_read_header
bt


可以得到如下调试信息
#0 asf_read_header (s=0x8c2f020, ap=0xbffff250) at libavformat/asfdec.c:581
#1 0x0812aff8 in avformat_open_input (ps=0xbffff2a4,
filename=0xbffff548 "/projects/media/wma/123.wma", fmt=0x0,
options=0xbffff2a0) at libavformat/utils.c:707
#2 0x0804a48f in dec_parse (filename=0xbffff548 "/projects/media/wma/123.wma")
at fileParse.c:29
#3 0x0804a66d in main (argc=2, argv=0xbffff394) at fileParse.c:69


通过以上分析可以知道,对于ASF文件格式解析来说,
我们只需要研究如下函数。


.read_probe = asf_probe,
.read_header = asf_read_header,
.read_packet = asf_read_packet,
.read_close = asf_read_close,
.read_seek = asf_read_seek,
.read_timestamp = asf_read_pts,


STEP3:
参考上面的函数,在工作平台实现相关函数。(略)

分享到:
评论

相关推荐

    Qt+FFMPEG+SDL实现的视频播放器

    总的来说,"Qt+FFMPEG+SDL实现的视频播放器"项目是一个综合性的实践案例,涵盖了多媒体处理、图形渲染和用户交互等多个领域,对于提升开发者在这些方面的技能具有很高的价值。通过深入研究这个项目,可以为创建自己...

    基于FFMPEG+SDL2播放音频

    基于FFMPEG+SDL2写的播放mp3文件程序,采用链表队列的方式来传递数据,详细解释见博文《基于FFMPEG+SDL2播放音频》,链接:https://blog.csdn.net/u011003120/article/details/81950045

    qt基于FFmPeg+SDL2.0+QOpenGLWidget实现的视频播放器

    qt使用FFmPeg+SDL2.0+QOpenGLWidget实现的视频播放器,FFmPeg+SDL2.0解码音视频,视频图像解码为YUV420的格式,然后使用QOpenGLWidget进行显示。亲测在windows和Linux下都可使用,附带FFmPeg+SDL2.0第三方库

    毕业设计基于Qt+FFmpeg+SDL实现的音视频播放器源码.zip

    毕业设计基于Qt+FFmpeg+SDL实现的音视频播放器源码.zip毕业设计基于Qt+FFmpeg+SDL实现的音视频播放器源码.zip毕业设计基于Qt+FFmpeg+SDL实现的音视频播放器源码.zip毕业设计基于Qt+FFmpeg+SDL实现的音视频播放器源码...

    ffmpeg+SDL2实现的视频播放器(windows版)

    这些文件可能包括主程序入口(如 `main.c` 或 `main.cpp`)、与 FFmpeg 交互的接口文件以及与 SDL2 集成的部分。例如,`main.cpp` 可能负责初始化 SDL2 窗口,加载 FFmpeg 解码后的视频帧到 SDL2 表面,并进行渲染。...

    最简单的FFMPEG+SDL播放器

    "最简单的FFMPEG+SDL播放器"项目,就是结合这两个强大的库,构建了一个基础的媒体播放器。对于初学者来说,这个项目具有极高的学习价值。通过阅读和理解代码,你可以了解如何使用FFmpeg进行音频和视频的解码,以及...

    ffmpeg+sdl视音频播放器

    ffmpeg+sdl播放器解码视音频,使用ffmpeg-2.5.2+SDL-1.2.15,参考ffmpeg官方例子,欢迎交流 内含10个工程 1.保存为bmp图片 2.解码视频 3.解码视频, 音频 4.分离代码,加入线程(伪同步) 5.视频同步到音频 6.音频同步到...

    ffmpeg+sdl视频播放器

    此外,项目中包含的"video_player"可能是一个源代码文件或者整个项目文件夹,里面包含了实现这个FFmpeg+SDL视频播放器的所有源代码、配置文件和其他相关资源。用户可以通过查看这些文件,了解如何将FFmpeg与SDL结合...

    play_FFMpeg+SDL_Qt+FFMPEG+SDL_qtffmpeg_ffmpeg_ffmpegsdl_

    总之,"play_FFMpeg+SDL_Qt+FFMPEG+SDL_qtffmpeg_ffmpeg_ffmpegsdl_"项目展示了如何利用FFmpeg进行视频解码,通过SDL进行渲染,以及使用Qt构建用户界面,形成一个完整的H264视频播放器。这样的项目对于深入理解和...

    FFmpeg+SDL播放视频

    在这个"FFmpeg+SDL播放视频"的学习项目中,我们将深入理解这两个库如何协同工作,帮助开发者在各种平台上播放视频。首先,我们需要了解FFmpeg的解码过程。FFmpeg支持多种视频和音频编码格式,它通过libavcodec库来...

    FFMPEG+SDL实现视频播放.zip

    在"FFMPEG+SDL实现视频播放.zip"这个压缩包中,我们很显然看到是关于如何利用这两个库来创建一个简单的视频播放器的项目。FFmpeg负责视频和音频的解码,而SDL则用来显示视频帧并处理用户交互,如快进和全屏操作。 ...

    基于FFmpeg+SDL的视频播放器_其它文档

    在“基于FFmpeg+SDL的视频播放器”项目中,可能还会涉及其他知识点,例如视频编码标准文档,这可能涵盖了H.264、HEVC等编码格式的详细信息,包括熵编码、运动补偿、量化和反量化等过程。VS开发的基础文档可能是指...

    基于C++ Qt+FFMPEG+SDL2写的视频播放器源代码,可以播放本地视频

    总的来说,这个基于C++、Qt、FFmpeg和SDL2的视频播放器项目涉及到了多媒体处理的多个方面,从基础的文件读取、解码到复杂的渲染和同步,对提升开发者在多媒体编程领域的技能有很大帮助。实际开发过程中,还会遇到如...

    ffmpeg+SDL2实现的音频播放器V2.0(无杂音)

    在这个"ffmpeg+SDL2实现的音频播放器V2.0(无杂音)"项目中,开发者利用 FFmpeg 的音频解码功能和 SDL2 的音频播放能力构建了一个高质量的音频播放器。以下是这个项目中涉及的主要知识点: 1. **FFmpeg 音频解码**...

    最简单的基于FFMPEG+SDL的视频播放器(2014.5.6)

    FFMPEG工程浩大,可以参考的书籍又不是很多,...但是几乎包含了使用FFMPEG播放一个视频所有必备的API,并且使用SDL显示解码出来的视频。十分适合新手学习FFmpeg。 使用了2014.5.6编译的类库,支持最新的HEVC以及VP9.

    QT + ffmpeg + sdl音频播放器

    QT + ffmpeg + SDL音频播放器是一种利用开源库组合来实现音频播放的应用程序。在这个项目中,QT是一个跨平台的C++应用程序开发框架,用于构建用户界面;ffmpeg是一个强大的多媒体处理库,负责音频和视频的解码;而...

    最简单的基于FFMPEG+SDL的视频播放器_FFMPEG解决方法.ra

    在FFmpeg中,我们使用`avformat_open_input`打开一个视频文件,`avformat_find_stream_info`获取流信息,然后`avcodec_find_decoder`找到相应的解码器。接着,`avcodec_alloc_context3`分配解码器上下文,并使用`...

    FFMPEG+SDL最新库文件和源文件

    总的来说,"FFMPEG+SDL最新库文件和源文件"的组合为多媒体开发提供了一个强大且灵活的基础。通过这个压缩包,你可以获得最新的技术,实现高效、多样的多媒体应用,满足不断增长的用户需求。无论是业余爱好者还是专业...

    ffmpeg +SDL 视频播放实例(目前只能显示视频,没有声音)

    FFmpeg是一个强大的命令行工具,用于处理音频和视频文件,包括转换、编码、解码、分割等多种功能。而Simple DirectMedia Layer(SDL)则是一个跨平台的多媒体库,主要用于处理图形、音频和输入设备。 在FFmpeg中,...

    ffmpeg+sdl+gcc环境搭建

    在进行FFmpeg开发时,结合SDL可以创建用户界面,实现视频播放等交互功能。GCC(GNU Compiler Collection)是GNU项目的一部分,提供了C、C++等多种编程语言的编译器。本文将详细介绍如何在你的系统上搭建FFmpeg与SDL2...

Global site tag (gtag.js) - Google Analytics