ffmpeg convert format
来源:互联网 发布:淘宝客软文案例 编辑:程序博客网 时间:2024/04/29 13:19
down voteaccepted
If you are looking just for stream copy you can do this quite easily.You can refer following steps.
//1. Do initialization using av_register_all();// 2. Open input file using avformat_open_input( &m_informat, filename.c_str(), 0, 0));//3. Find input stream info. if ((ret = avformat_find_stream_info(m_informat, 0))< 0) { av_strerror(ret,errbuf,sizeof(errbuf)); PRINT_VAL("Not Able to find stream info:: ", errbuf) ret = -1; return ret; } for (unsigned int i = 0; i<m_informat->nb_streams; i++) { if(m_informat->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO) { PRINT_MSG("Found Video Stream ") m_in_vid_strm_idx = i; m_in_vid_strm = m_informat->streams[i]; } if(m_informat->streams[i]->codec->codec_type == AVMEDIA_TYPE_AUDIO) { m_in_aud_strm_idx = i; m_in_aud_strm = m_informat->streams[i]; }// 4. Create ouputfile and allocate output format. AVOutputFormat *outfmt = NULL; std::string outfile = std::string(filename) + "clip_out.ts"; outfmt = av_guess_format(NULL,outfile.c_str(),NULL); if(outfmt == NULL) { ret = -1; return ret; } else { m_outformat = avformat_alloc_context(); if(m_outformat) { m_outformat->oformat = outfmt; _snprintf(m_outformat->filename, sizeof(m_outformat->filename), "%s", outfile.c_str()); } else { ret = -1; return ret; } }//5. Add audio and video stream to output format. AVCodec *out_vid_codec,*out_aud_codec; out_vid_codec = out_aud_codec = NULL; if(outfmt->video_codec != AV_CODEC_ID_NONE && m_in_vid_strm != NULL) { out_vid_codec = avcodec_find_encoder(outfmt->video_codec); if(NULL == out_vid_codec) { PRINT_MSG("Could Not Find Vid Encoder") ret = -1; return ret; } else { PRINT_MSG("Found Out Vid Encoder ") m_out_vid_strm = avformat_new_stream(m_outformat, out_vid_codec); if(NULL == m_out_vid_strm) { PRINT_MSG("Failed to Allocate Output Vid Strm ") ret = -1; return ret; } else { PRINT_MSG("Allocated Video Stream ") if(avcodec_copy_context(m_out_vid_strm->codec, m_informat->streams[m_in_vid_strm_idx]->codec) != 0) { PRINT_MSG("Failed to Copy Context ") ret = -1; return ret; } else { m_out_vid_strm->sample_aspect_ratio.den = m_out_vid_strm->codec->sample_aspect_ratio.den; m_out_vid_strm->sample_aspect_ratio.num = m_in_vid_strm->codec->sample_aspect_ratio.num; PRINT_MSG("Copied Context ") m_out_vid_strm->codec->codec_id = m_in_vid_strm->codec->codec_id; m_out_vid_strm->codec->time_base.num = 1; m_out_vid_strm->codec->time_base.den = m_fps*(m_in_vid_strm->codec->ticks_per_frame); m_out_vid_strm->time_base.num = 1; m_out_vid_strm->time_base.den = 1000; m_out_vid_strm->r_frame_rate.num = m_fps; m_out_vid_strm->r_frame_rate.den = 1; m_out_vid_strm->avg_frame_rate.den = 1; m_out_vid_strm->avg_frame_rate.num = m_fps; m_out_vid_strm->duration = (m_out_end_time - m_out_start_time)*1000; } } } } if(outfmt->audio_codec != AV_CODEC_ID_NONE && m_in_aud_strm != NULL) { out_aud_codec = avcodec_find_encoder(outfmt->audio_codec); if(NULL == out_aud_codec) { PRINT_MSG("Could Not Find Out Aud Encoder ") ret = -1; return ret; } else { PRINT_MSG("Found Out Aud Encoder ") m_out_aud_strm = avformat_new_stream(m_outformat, out_aud_codec); if(NULL == m_out_aud_strm) { PRINT_MSG("Failed to Allocate Out Vid Strm ") ret = -1; return ret; } else { if(avcodec_copy_context(m_out_aud_strm->codec, m_informat->streams[m_in_aud_strm_idx]->codec) != 0) { PRINT_MSG("Failed to Copy Context ") ret = -1; return ret; } else { PRINT_MSG("Copied Context ") m_out_aud_strm->codec->codec_id = m_in_aud_strm->codec->codec_id; m_out_aud_strm->codec->codec_tag = 0; m_out_aud_strm->pts = m_in_aud_strm->pts; m_out_aud_strm->duration = m_in_aud_strm->duration; m_out_aud_strm->time_base.num = m_in_aud_strm->time_base.num; m_out_aud_strm->time_base.den = m_in_aud_strm->time_base.den; } } } } // 6. Finally output header. if (!(outfmt->flags & AVFMT_NOFILE)) { if (avio_open2(&m_outformat->pb, outfile.c_str(), AVIO_FLAG_WRITE,NULL, NULL) < 0) { PRINT_VAL("Could Not Open File ", outfile) ret = -1; return ret; } } /* Write the stream header, if any. */ if (avformat_write_header(m_outformat, NULL) < 0) { PRINT_VAL("Error Occurred While Writing Header ", outfile) ret = -1; return ret; } else { PRINT_MSG("Written Output header ") m_init_done = true; }// 7. Now in while loop read frame using av_read_frame and write to output format using // av_interleaved_write_frame(). You can use following loop while(av_read_frame(m_informat, &pkt) >= 0 && (m_num_frames-- > 0)) { if(pkt.stream_index == m_in_vid_strm_idx) { PRINT_VAL("ACTUAL VID Pkt PTS ",av_rescale_q(pkt.pts,m_in_vid_strm->time_base, m_in_vid_strm->codec->time_base)) PRINT_VAL("ACTUAL VID Pkt DTS ", av_rescale_q(pkt.dts, m_in_vid_strm->time_base, m_in_vid_strm->codec->time_base )) av_init_packet(&outpkt); if(pkt.pts != AV_NOPTS_VALUE) { if(last_vid_pts == vid_pts) { vid_pts++; last_vid_pts = vid_pts; } outpkt.pts = vid_pts; PRINT_VAL("ReScaled VID Pts ", outpkt.pts) } else { outpkt.pts = AV_NOPTS_VALUE; } if(pkt.dts == AV_NOPTS_VALUE) { outpkt.dts = AV_NOPTS_VALUE; } else { outpkt.dts = vid_pts; PRINT_VAL("ReScaled VID Dts ", outpkt.dts) PRINT_MSG("=======================================") } outpkt.data = pkt.data; outpkt.size = pkt.size; outpkt.stream_index = pkt.stream_index; outpkt.flags |= AV_PKT_FLAG_KEY; last_vid_pts = vid_pts; if(av_interleaved_write_frame(m_outformat, &outpkt) < 0) { PRINT_MSG("Failed Video Write ") } else { m_out_vid_strm->codec->frame_number++; } av_free_packet(&outpkt); av_free_packet(&pkt); } else if(pkt.stream_index == m_in_aud_strm_idx) { PRINT_VAL("ACTUAL AUD Pkt PTS ", av_rescale_q(pkt.pts, m_in_aud_strm->time_base, m_in_aud_strm->codec->time_base)) PRINT_VAL("ACTUAL AUD Pkt DTS ", av_rescale_q(pkt.dts, m_in_aud_strm->time_base, m_in_aud_strm->codec->time_base)) //num_aud_pkt++; av_init_packet(&outpkt); if(pkt.pts != AV_NOPTS_VALUE) { outpkt.pts = aud_pts; PRINT_VAL("ReScaled AUD PTS ", outpkt.pts) } else { outpkt.pts = AV_NOPTS_VALUE; } if(pkt.dts == AV_NOPTS_VALUE) { outpkt.dts = AV_NOPTS_VALUE; } else { outpkt.dts = aud_pts; PRINT_VAL("ReScaled AUD DTS ", outpkt.dts) PRINT_MSG("====================================") if( outpkt.pts >= outpkt.dts) { outpkt.dts = outpkt.pts; } if(outpkt.dts == aud_dts) { outpkt.dts++; } if(outpkt.pts < outpkt.dts) { outpkt.pts = outpkt.dts; aud_pts = outpkt.pts; } } outpkt.data = pkt.data; outpkt.size = pkt.size; outpkt.stream_index = pkt.stream_index; outpkt.flags |= AV_PKT_FLAG_KEY; vid_pts = aud_pts; aud_pts++; if(av_interleaved_write_frame(m_outformat, &outpkt) < 0) { PRINT_MSG("Faile Audio Write ") } else { m_out_aud_strm->codec->frame_number++; } av_free_packet(&outpkt); av_free_packet(&pkt); } else { PRINT_MSG("Got Unknown Pkt ") //num_unkwn_pkt++; } //num_total_pkt++; }//8. Finally write trailer and clean up everything av_write_trailer(m_outformat); av_free_packet(&outpkt); av_free_packet(&pkt);
0 0
- ffmpeg convert format
- convert video/audio file to audio format with ffmpeg
- convert mail format
- ip format convert
- ffmpeg convert audio
- Convert .pkl format to .mat format
- ffmpeg pixel format
- convert data to html format.
- convert the .pfx file to pem format
- OBJ2OPENGL Convert OBJ file to OpenGL format
- Diskpart - convert disk to gpt format
- Convert transcript from Youtube format to SRT format
- convert wav to mp3 with ffmpeg
- Ffmpeg 1.0 Filter format流程分析
- How to convert a date to internal or external format?
- Convert normal map data to SVG format data
- convert a PKCS 12 cert to PEM format
- Convert QTP result to html format(Using VBScript)
- error C2011: “fd_set”: “struct”类型重定义
- CACHE & TLB (May 14)
- 在PADS中创建库,并在其中添加自己的PCB封装以及Part type
- 早上就看到区号
- ORACLE 等待事件--《深入浅出ORACLE第八章》
- ffmpeg convert format
- 音视频同步(播放)原理
- XML入门教程之了解认识XML
- 风行播放器2014 v3.0.1 正式版
- Jedis使用示例
- 字符串是否包含问题
- wifi万能钥匙 for mac v1.0 官方免费版
- 百度杀毒中文版 v1.8.0.1243 官方免费版
- 不小心将手机内存卡上的文件误删除应该怎么恢复