1 回答

TA貢獻1877條經驗 獲得超1個贊
// 初始化libavcodec, and register all codecs and formats
av_register_all();
// 打開媒體文件
input_format_context = 0;
ret = av_open_input_file(
&input_format_context,
open_file_name.data(),
0,
0,
0);
if(0 != ret || !input_format_context)
{
LOG( "FFMPEG Load File " << open_file_name << " Failed ." << ret);
return ret;
}
else
{
LOG( "FFMPEG Load File " << open_file_name << " Success .");
}
// 取出流信息
ret = av_find_stream_info(input_format_context);
if(0 != ret)
{
LOG( "FFMPEG Can Not Find Stream Info .");
return ret;
}
// 尋找第一個視頻流
for(unsigned int i = 0; i < input_format_context->nb_streams; i++)
{
if(input_format_context->streams[i]->codec->codec_type == CODEC_TYPE_VIDEO)
{
video_stream_index = i;
}
else if(input_format_context->streams[i]->codec->codec_type == CODEC_TYPE_AUDIO)
{
audio_stream_index = i;
}
}
if(video_stream_index == -1 && audio_stream_index == -1)
{
// 既沒有音頻也沒有視頻,直接退出
LOG("Do not have video stream and audio stream");
return -1;
}
// 得到視頻流編碼上下文的指針
if(video_stream_index != -1)
{
video_decode_context = input_format_context->streams[video_stream_index]->codec;
// 尋找視頻流的解碼器
video_decode = avcodec_find_decoder(video_decode_context->codec_id);
if(!video_decode)
{
LOG( "FFMPEG Can Not Decoder For " << (int)video_decode_context->codec_id);
}
// 打開解碼器
ret = avcodec_open(video_decode_context,video_decode);
if(0 != ret)
{
LOG( "FFMPEG Can Not Open Video Decoder .");
}
LOG("Image Size " << video_decode_context->width << "*" << video_decode_context->height);
LOG("Frame Rate " << (float)video_decode_context->time_base.den / (float)video_decode_context->time_base.num);
}
// 得到音頻流編碼上下文的指針
if(audio_stream_index != -1)
{
audio_decode_context = input_format_context->streams[audio_stream_index]->codec;
audio_decode = avcodec_find_decoder(audio_decode_context->codec_id);
if(!audio_decode)
{
LOG( "FFMPEG Can Not Decoder For " << (int)audio_decode_context->codec_id);
}
ret = avcodec_open(audio_decode_context,audio_decode);
if(0 != ret)
{
LOG( "FFMPEG Can Not Open Audio Decoder .");
}
}
讀圖像或者音頻數據
// 從流中讀取數據
int frameFinished = 0;
AVPacket packet;
AVFrame* frame = 0;
while(av_read_frame(input_format_context, &packet) >= 0)
{
if(packet.stream_index == video_stream_index)
{
if(frame == 0)
frame = avcodec_alloc_frame();
// 視頻
avcodec_decode_video(video_decode_context, frame, &frameFinished,packet.data,packet.size);
第三個 問題 也很簡單 會了前2個。搜索ffmpeg 播放位置
- 1 回答
- 0 關注
- 194 瀏覽
添加回答
舉報