ffmpeg对视频文件进行解码的大致流程
2011-07-31 10:48
363 查看
ffmpeg对视频文件进行解码的大致流程
output_example.c 中AV同步的代码如下(我的代码有些修改),这个实现相当简单,不过挺说明问题。
阅读前希望大家先了解一下时间戳的概念。
/* compute current audio and video time */
if (pOutputVars->pOutAudio_st)//存在音频流
pOutputVars->audio_pts = (double)pOutputVars->pOutAudio_st->pts.val
* pOutputVars->pOutAudio_st->time_base.num
/ pOutputVars- >pOutAudio_st->time_base.den; //(pts是时间戳结构)输出音频的时间戳, 转换为基准时间
else
pOutputVars->audio_pts = 0.0;
if (pOutputVars->pOutVideo_st)
pOutputVars->video_pts = (double)pOutputVars->pOutVideo_st->pts.val
* pOutputVars->pOutVideo_st->time_base.num / pOutputVars- >pOutVideo_st->time_base.den;//输出视频时间戳
else
pOutputVars->video_pts = 0.0;
if (!pOutputVars->pOutAudio_st && !pOutputVars->pOutVideo_st)
return 0;
/* write interleaved audio and video frames */
if (!pOutputVars->pOutVideo_st || (pOutputVars->pOutVideo_st && pOutputVars->pOutAudio_st && pOutputVars->audio_pts <
pOutputVars->video_pts))
{
write_audio_frame(pOutputVars->pOutFormatCtx, pOutputVars->pOutAudio_st, pInputAudioBuf);
//没有视频流,或者音频流时间没赶上视频流(通过比较时间戳), 则输出(编码输出)音频祯数据
}
else
{
write_video_frame(pOutputVars->pOutFormatCtx, pOutputVars->pOutVideo_st, pInputVedioFrame);//否则输出视频祯数据
}
输出数据的时间戳怎么得到的, 以音频为例:
pkt.size= avcodec_encode_audio(c, audio_outbuf, audio_outbuf_size, pInputAudioBuf);//源数据应该包含时间戳, pInputAudio是源文
件解码后的音频数据
pkt.pts= av_rescale_q(c->coded_frame->pts, c->time_base, st->time_base);//编码后的祯也含有源文件的时间戳,这个函数应该是转换同时
间基准,没研究过
pkt.flags |= PKT_FLAG_KEY;
pkt.stream_index= st->index;
pkt.data= audio_outbuf;
...
应该就是这么个过程了,然后用av_write_frame(oc, &pkt), 把音频祯和视频祯交错写入到输出文件. 通过上面分析,可以看到,有时候可能连续写几个音频
祯或视频祯.
播放时的同步可能ffplay中有,还没细看
1. 注册所有容器格式和CODEC: av_register_all() 2. 打开文件: av_open_input_file() 3. 从文件中提取流信息: av_find_stream_info() 4. 穷举所有的流,查找其中种类为CODEC_TYPE_VIDEO 5. 查找对应的解码器: avcodec_find_decoder() 6. 打开编解码器: avcodec_open() 7. 为解码帧分配内存: avcodec_alloc_frame() 8. 不停地从码流中提取中帧数据: av_read_frame() 9. 判断帧的类型,对于视频帧调用: avcodec_decode_video() 10. 解码完后,释放解码器: avcodec_close() 11. 关闭输入文件:av_close_input_file() |
阅读前希望大家先了解一下时间戳的概念。
/* compute current audio and video time */
if (pOutputVars->pOutAudio_st)//存在音频流
pOutputVars->audio_pts = (double)pOutputVars->pOutAudio_st->pts.val
* pOutputVars->pOutAudio_st->time_base.num
/ pOutputVars- >pOutAudio_st->time_base.den; //(pts是时间戳结构)输出音频的时间戳, 转换为基准时间
else
pOutputVars->audio_pts = 0.0;
if (pOutputVars->pOutVideo_st)
pOutputVars->video_pts = (double)pOutputVars->pOutVideo_st->pts.val
* pOutputVars->pOutVideo_st->time_base.num / pOutputVars- >pOutVideo_st->time_base.den;//输出视频时间戳
else
pOutputVars->video_pts = 0.0;
if (!pOutputVars->pOutAudio_st && !pOutputVars->pOutVideo_st)
return 0;
/* write interleaved audio and video frames */
if (!pOutputVars->pOutVideo_st || (pOutputVars->pOutVideo_st && pOutputVars->pOutAudio_st && pOutputVars->audio_pts <
pOutputVars->video_pts))
{
write_audio_frame(pOutputVars->pOutFormatCtx, pOutputVars->pOutAudio_st, pInputAudioBuf);
//没有视频流,或者音频流时间没赶上视频流(通过比较时间戳), 则输出(编码输出)音频祯数据
}
else
{
write_video_frame(pOutputVars->pOutFormatCtx, pOutputVars->pOutVideo_st, pInputVedioFrame);//否则输出视频祯数据
}
输出数据的时间戳怎么得到的, 以音频为例:
pkt.size= avcodec_encode_audio(c, audio_outbuf, audio_outbuf_size, pInputAudioBuf);//源数据应该包含时间戳, pInputAudio是源文
件解码后的音频数据
pkt.pts= av_rescale_q(c->coded_frame->pts, c->time_base, st->time_base);//编码后的祯也含有源文件的时间戳,这个函数应该是转换同时
间基准,没研究过
pkt.flags |= PKT_FLAG_KEY;
pkt.stream_index= st->index;
pkt.data= audio_outbuf;
...
应该就是这么个过程了,然后用av_write_frame(oc, &pkt), 把音频祯和视频祯交错写入到输出文件. 通过上面分析,可以看到,有时候可能连续写几个音频
祯或视频祯.
播放时的同步可能ffplay中有,还没细看
相关文章推荐
- ffmpeg对视频文件进行解码的大致流程
- FFMpeg对视频文件进行解码的大致流程
- 使用FFmpeg对视频进行编解码的一般流程
- ffmpeg解码音频数据时,进行重采样(即改变文件原有的采样率)
- ffmpeg解码视频存为BMP文件
- 使用ffmpeg命令对视频文件进行截图
- 音视频编解码问题:javaCV如何快速进行音频预处理和解复用编解码(基于javaCV-FFMPEG)
- Android本地视频播放器开发--ffmpeg解码视频文件中的音频(1)
- Android本地视频播放器开发--ffmpeg解码视频文件中的音频(1)
- ffmpeg解码视频保存为BMP文件
- 通过C++/CLI使用FFMPEG库进行视频解码[初步]
- 使用ffmpeg进行音视频编解码时用到的函数介绍
- 使用 ffmpeg 进行网络推流:拉流->解封装->解码->处理原始数据(音频、视频)->编码->编码->推流
- 【FFMpeg视频开发与应用基础】一、使用FFmpeg命令行工具和批处理脚本进行简单的音视频文件编辑
- Android本地视频播放器开发--ffmpeg解码视频文件中的音频(2)
- 使用ffmpeg进行视频解码以及图像转换
- Ffmpeg进行视频文件转换
- FFmpeg 学习之 定时器解码两路视频并进行对比<2>
- 使用ffmpeg进行视频文件转换成FLV整理
- 使用 FFmpeg 开发播放器基础--使用 ffmpeg 解码视频文件