#if 0
//2018-12-19 ffmpeg进行转封装不进行转码
//ffmpeg库4.0.2
#include<iostream>
#include<thread>
extern \"C\"
{
#include <libavformat/avformat.h>
#include <libswscale/swscale.h>
}
#pragma comment(lib,\"avformat.lib\")
#pragma comment(lib,\"avcodec.lib\")
#pragma comment(lib,\"avutil.lib\")
#pragma comment(lib,\"swscale.lib\")
using namespace std;
int Open_In_fine(const char* infile,int& videoidx,int& audioidx, AVFormatContext* &ic)
{
avformat_open_input(&ic, infile, 0, 0);
if (!ic)
{
//cout << \"avformat_open_input failed!\" << endl;
return -1;
}
for (int i = 0; i < ic->nb_streams; i++)
{
if (ic->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)
videoidx = i;
if (ic->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_AUDIO)
audioidx = i;
}
if (videoidx == -1)
{
//cout << \"Codec find failed!\" << endl;
return -1;
}
av_dump_format(ic, 0, infile, 0);
return 0;
}
int Open_out_put_file(const char* outfile, int& videoidx, int& audioidx, AVStream *videoStream, AVStream *audioStream , AVFormatContext* &ic, AVFormatContext* &oc)
{
avformat_alloc_output_context2(&oc, NULL, NULL, outfile);
if (!oc)
{
//cerr << \"avformat_alloc_output_context2 \" << outfile << \" failed!\" << endl;
return -1;
}
if (videoidx != -1) {
videoStream = avformat_new_stream(oc, NULL);
avcodec_parameters_copy(videoStream->codecpar, ic->streams[videoidx]->codecpar);
videoStream->codecpar->codec_tag = 0;
}
if (audioidx != -1) {
audioStream = avformat_new_stream(oc, NULL);
avcodec_parameters_copy(audioStream->codecpar, ic->streams[audioidx]->codecpar);
audioStream->codecpar->codec_tag = 0;
}
//oc->streams[videoidx]->codec->flags |= AV_CODEC_FLAG2_LOCAL_HEADER;
//cout << \"================================================\" << endl;
av_dump_format(oc, 0, outfile, 1);
int ret = avio_open(&oc->pb, outfile, AVIO_FLAG_WRITE);
if (ret < 0)
{
//cerr << \"avio open failed!\" << endl;
return -1;
}
ret = avformat_write_header(oc, NULL);
if (ret < 0)
{
//cerr << \"avformat_write_header failed!\" << endl;
//getchar();
}
return 0;
}
void Time_ (AVPacket * pkt, AVFormatContext* &ic, AVFormatContext* &oc)
{
pkt->pts = av_rescale_q_rnd(pkt->pts,
ic->streams[pkt->stream_index]->time_ ,
oc->streams[pkt->stream_index]->time_ ,
(AVRounding)(AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX)
);
pkt->dts = av_rescale_q_rnd(pkt->dts,
ic->streams[pkt->stream_index]->time_ ,
oc->streams[pkt->stream_index]->time_ ,
(AVRounding)(AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX)
);
pkt->pos = -1;
pkt->duration = av_rescale_q_rnd(pkt->duration,
ic->streams[pkt->stream_index]->time_ ,
oc->streams[pkt->stream_index]->time_ ,
(AVRounding)(AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX)
);
}
void write_url_file(AVFormatContext *ic, AVFormatContext *oc, int& videoidx, int& audioidx) {
AVPacket *pkt = av_packet_alloc();
while ((av_read_ (ic,pkt)>=0) ){
Time_ (pkt,ic,oc);
if (pkt->stream_index== videoidx) {
av_write_ (oc,pkt);
cout << \"+\";
continue;
}
else if(pkt->stream_index == audioidx)
{
av_write_ (oc, pkt);
cout << \"-\";
continue;
}
av_packet_unref(pkt);
av_packet_free(&pkt);
}
av_write_trailer(oc);
return;
}
void close_ffmpeg(AVFormatContext * &ic, AVFormatContext * oc)
{
avformat_close_input(&ic);
avformat_free_context(oc);
}
int main() {
char path[] = \"11.mp4\";
char outfile[] = \"Test.mp4\";
int videoidx = -1;
int audioidx = -1;
AVFormatContext *ic = nullptr;
AVFormatContext *oc = nullptr;
AVStream *videoStream = nullptr;
AVStream *audioStream = nullptr;
Open_In_fine(path,videoidx,audioidx,ic);
Open_out_put_file(outfile, videoidx, audioidx, videoStream, audioStream, ic, oc);
write_url_file(ic,oc,videoidx,audioidx);
close_ffmpeg(ic, oc);
cin.get();
return 0;
}
#endif // 0
继续阅读与本文标签相同的文章
下一篇 :
一文告诉你:互联网如何改变我们的生活
-
Edge逐步融入Fluent Design元素:新版颜色筛选器控件上线
2026-05-18栏目: 教程
-
阿里云服务器突发性能实例t5配置性能使用场景及注意事项
2026-05-18栏目: 教程
-
Square为澳大利亚餐馆提供定制平台!
2026-05-18栏目: 教程
-
711便利店:日本计划关店1000家,母公司将裁员3000人
2026-05-18栏目: 教程
-
阿里云服务器共享型实例xn4 n4 性价比高适合个人博客 中小型网站
2026-05-18栏目: 教程
