精华内容
下载资源
问答
  • 1.抽取音频ffmpeg -i input.mp4 -vn -y -acodec copy output.aac2.提取视频ffmpeg -i input.mkv -vcodec copy –an output.mp43.音视频合成ffmpeg -i video.avi -i audio.mp3 -vcodec copy -acodec copy output.avi4...

    1.抽取音频

    ffmpeg -i input.mp4 -vn -y -acodec copy output.aac

    2.提取视频

    ffmpeg -i input.mkv -vcodec copy –an output.mp4

    3.音视频合成

    ffmpeg -i video.avi -i audio.mp3 -vcodec copy -acodec copy output.avi

    4.查看音视频信息

    ffmpeg -i input.mp4

    5.aac和ac3简介

    aac和ac3是音频编码格式,acc是什么,反正不是音频格式。

    aac全名是Advanced Audio Coding,后缀名一般为m4a、aac、mp4、mkv等,其中mp4、mkv为视频格式,采样率一般为44.1khz,码率一般是64kbps到192kbps,声道一般为双声道立体声。

    ac3全称是(Dolby)Audio Codec 3,一般出现在DVD视频格式中,后缀名为vob,采样率一般为48khz,码率一般是192kbps到384kbps,声道为双声道或6声道。

    展开全文
  • QQ 1274510382 Wechat JNZ_aming 商业联盟 QQ群538250800 技术搞事 QQ群599020441 解决方案 QQ群152889761 加入我们 QQ群649347320 共享学习 QQ群674240731 纪年科技aming 网络安全 ,深度学习,嵌入式,机器强化,生物...

    在这里插入图片描述


    QQ 1274510382
    Wechat JNZ_aming
    商业联盟 QQ群538250800
    技术搞事 QQ群599020441
    解决方案 QQ群152889761
    加入我们 QQ群649347320
    共享学习 QQ群674240731
    纪年科技aming
    网络安全 ,深度学习,嵌入式,机器强化,生物智能,生命科学。


    在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

    展开全文
  • ffmpeg视音频处理工具

    2020-03-12 10:53:28
    FFmpeg是一套对视频,音频进行格式化,转码,内容编辑,合并等操作的工具. ffmpeg官网 http://ffmpeg.org/ ffmpeg对各大操作系统均有支持,github上中有其对应的源码,也可以直接下载编译后的工具使用 下载后将文件...
    • FFmpeg是一套对视频,音频进行格式化,转码,内容编辑,合并等操作的工具.
    • ffmpeg官网
    http://ffmpeg.org/
    
    • ffmpeg对各大操作系统均有支持,github上中有其对应的源码,也可以直接下载编译后的工具使用

    在这里插入图片描述

    • 下载后将文件解压得到以下文件,其中bin目录下为所有ffmpeg可以行文件工具

    在这里插入图片描述

    • 示例:为视频添加背景音乐

    • 命令格式,windows下需要加上.exe后缀

    ffmpeg.exe -i 视频文件所在目录 -i 背景音乐所在目录 -t 输出视频时长 -y  输出文件路径
    
    • 文件所在目录地址可以是相对路径,也可以是绝对路径
    • 参数说明
    参数 说明
    -i 输入源
    -t 时长
    -y 是否覆盖同名文件
    • 在bin目录下放一个测试视频文件

    在这里插入图片描述

    • 然后打开cmd命令行,输入以下命令,最后的输出文件名为 reset.mp4,视频时长为10秒
    ffmpeg.exe -i test.mp4 -i E:\6.music\1.colud-music\花粥_在山河的角落里唱给你听.mp3 -t 10 reset.mp4
    
    • 执行命令后命令行会出现以下内容

    在这里插入图片描述

    • 最后在bin目录下会得到rest.mp4文件,打开播放后会得到一个时长为10秒有背景音乐的视频

    在这里插入图片描述

    • 示例:截取视频中某一秒的图片
    • 命令
    ffmpeg.exe -ss 时间表达式 -y -i 目标视频路径 -vframes 1 视频输出地址
    
    • 参数说明
    参数 说明
    -ss 时间段表达式,例如 00:00:01 表示为视频第一秒
    -y 是否覆盖同名文件
    i 输入源
    vframes 视频帧数
    • 截取一个视频文件的第一秒图片
    ffmpeg.exe -ss 00:00:01 -y -i test.mp4 -vframes 1 s.jpg
    

    在这里插入图片描述

    在Java中使用ffmpeg

    • 在java程序中可以执行cmd命令行工具,需要使用到 ProcessBuilder 工具类
    • 具体使用如下
    // 可执行命令进程
    ProcessBuilder processBuilder = new ProcessBuilder();
    
    // 设置执行命令
    List<String> command = new ArrayList<>();
    command.add("ipconfig"); // 查看ip地址命令
    processBuilder.command(command);
    
    // 执行命令
    Process start = processBuilder.start();
    // 获取输入流
    InputStream inputStream = start.getInputStream();
    
    // 打印输入流信息
    String string = StreamUtils.copyToString(inputStream, Charset.forName("GBK"));
    System.out.println(string);
    
    • 运行代码控制台打印以下内容

    在这里插入图片描述

    示例:使用java程序调用ffmpeg,合并视频与音频文件

     // 可执行命令进程
            ProcessBuilder processBuilder = new ProcessBuilder();
    
            // 设置执行命令
            List<String> command = new ArrayList<>();
    
            // 可执行文件路径
            String ffmpeg_exe = "D:\\1.dev-office\\19.ffmpeg\\ffmpeg\\bin\\ffmpeg.exe";
            command.add(ffmpeg_exe);
    
            // 命令参数
           command.add("-i");
    
            // 视频文件路径
            String videoPath = "E:\\9.vedio\\test.mp4";
            command.add(videoPath);
    
            command.add("-i");
            // 音频文件路径
            String audioPath = "E:\\6.music\\1.colud-music\\花粥_在山河的角落里唱给你听.mp3";
            command.add(audioPath);
            // 格式化后视频输出路径
            String outVideoPath = "E:\\9.vedio\\outVideoPath.mp4";
            command.add(outVideoPath);
    
            for (String str: command){
                System.out.print(str + " ");
            }
    
            processBuilder.command(command);
            // 执行命令
            Process start = processBuilder.start();
    
            // 得到输入流
            InputStream inputStream = start.getInputStream();
           // String string = StreamUtils.copyToString(inputStream, Charset.forName("GBK"));
    
            OutputStream outputStream = start.getOutputStream();
            InputStream errorStream = start.getErrorStream();
    
            // 关闭流
            if(inputStream != null){
                inputStream.close();
            }
            if(outputStream != null){
                outputStream.close();
            }
    
            if(errorStream != null){
                errorStream.close();
            }
            // 打印执行命令后的内容
            //System.out.println(string);
    
    • 得到以下新文件

    在这里插入图片描述

    展开全文
  • 视音频复用器(Muxer)即是将视频压缩数据(例如H.264)和音频压缩数据(例如AAC)合并到一个封装格式数据(例如MKV)中去。如图所示。在这个过程中并不涉及到编码和解码。 本文记录的程序将一个H.26

    =====================================================

    最简单的基于FFmpeg的封装格式处理系列文章列表:

    最简单的基于FFmpeg的封装格式处理:视音频分离器简化版(demuxer-simple)

    最简单的基于FFmpeg的封装格式处理:视音频分离器(demuxer)

    最简单的基于FFmpeg的封装格式处理:视音频复用器(muxer)

    最简单的基于FFMPEG的封装格式处理:封装格式转换(remuxer)

    =====================================================


    简介

    打算记录一下基于FFmpeg的封装格式处理方面的例子。包括了视音频分离,复用,封装格式转换。这是第3篇。

    本文记录一个基于FFmpeg的视音频复用器(Simplest FFmpeg muxer)。视音频复用器(Muxer)即是将视频压缩数据(例如H.264)和音频压缩数据(例如AAC)合并到一个封装格式数据(例如MKV)中去。如图所示。在这个过程中并不涉及到编码和解码。



     
    本文记录的程序将一个H.264编码的视频码流文件和一个MP3编码的音频码流文件,合成为一个MP4封装格式的文件。

    流程

    程序的流程如下图所示。从流程图中可以看出,一共初始化了3个AVFormatContext,其中2个用于输入,1个用于输出。3个AVFormatContext初始化之后,通过avcodec_copy_context()函数可以将输入视频/音频的参数拷贝至输出视频/音频的AVCodecContext结构体。然后分别调用视频输入流和音频输入流的av_read_frame(),从视频输入流中取出视频的AVPacket,音频输入流中取出音频的AVPacket,分别将取出的AVPacket写入到输出文件中即可。其间用到了一个不太常见的函数av_compare_ts(),是比较时间戳用的。通过该函数可以决定该写入视频还是音频。


    本文介绍的视音频复用器,输入的视频不一定是H.264裸流文件,音频也不一定是纯音频文件。可以选择两个封装过的视音频文件作为输入。程序会从视频输入文件中“挑”出视频流,音频输入文件中“挑”出音频流,再将“挑选”出来的视音频流复用起来。
    PS1:对于某些封装格式(例如MP4/FLV/MKV等)中的H.264,需要用到名称为“h264_mp4toannexb”的bitstream filter。
    PS2:对于某些封装格式(例如MP4/FLV/MKV等)中的AAC,需要用到名称为“aac_adtstoasc”的bitstream filter。

    简单介绍一下流程中各个重要函数的意义:
    avformat_open_input():打开输入文件。
    avcodec_copy_context():赋值AVCodecContext的参数。
    avformat_alloc_output_context2():初始化输出文件。
    avio_open():打开输出文件。
    avformat_write_header():写入文件头。
    av_compare_ts():比较时间戳,决定写入视频还是写入音频。这个函数相对要少见一些。
    av_read_frame():从输入文件读取一个AVPacket。
    av_interleaved_write_frame():写入一个AVPacket到输出文件。
    av_write_trailer():写入文件尾。


    代码

    下面贴上代码:

    /**
     * 最简单的基于FFmpeg的视音频复用器
     * Simplest FFmpeg Muxer
     *
     * 雷霄骅 Lei Xiaohua
     * leixiaohua1020@126.com
     * 中国传媒大学/数字电视技术
     * Communication University of China / Digital TV Technology
     * http://blog.csdn.net/leixiaohua1020
     *
     * 本程序可以将视频码流和音频码流打包到一种封装格式中。
     * 程序中将AAC编码的音频码流和H.264编码的视频码流打包成
     * MPEG2TS封装格式的文件。
     * 需要注意的是本程序并不改变视音频的编码格式。
     *
     * This software mux a video bitstream and a audio bitstream 
     * together into a file.
     * In this example, it mux a H.264 bitstream (in MPEG2TS) and 
     * a AAC bitstream file together into MP4 format file.
     *
     */
    
    #include <stdio.h>
    
    #define __STDC_CONSTANT_MACROS
    
    #ifdef _WIN32
    //Windows
    extern "C"
    {
    #include "libavformat/avformat.h"
    };
    #else
    //Linux...
    #ifdef __cplusplus
    extern "C"
    {
    #endif
    #include <libavformat/avformat.h>
    #ifdef __cplusplus
    };
    #endif
    #endif
    
    /*
    FIX: H.264 in some container format (FLV, MP4, MKV etc.) need 
    "h264_mp4toannexb" bitstream filter (BSF)
      *Add SPS,PPS in front of IDR frame
      *Add start code ("0,0,0,1") in front of NALU
    H.264 in some container (MPEG2TS) don't need this BSF.
    */
    //'1': Use H.264 Bitstream Filter 
    #define USE_H264BSF 0
    
    /*
    FIX:AAC in some container format (FLV, MP4, MKV etc.) need 
    "aac_adtstoasc" bitstream filter (BSF)
    */
    //'1': Use AAC Bitstream Filter 
    #define USE_AACBSF 0
    
    
    
    int main(int argc, char* argv[])
    {
    	AVOutputFormat *ofmt = NULL;
    	//Input AVFormatContext and Output AVFormatContext
    	AVFormatContext *ifmt_ctx_v = NULL, *ifmt_ctx_a = NULL,*ofmt_ctx = NULL;
    	AVPacket pkt;
    	int ret, i;
    	int videoindex_v=-1,videoindex_out=-1;
    	int audioindex_a=-1,audioindex_out=-1;
    	int frame_index=0;
    	int64_t cur_pts_v=0,cur_pts_a=0;
    
    	//const char *in_filename_v = "cuc_ieschool.ts";//Input file URL
    	const char *in_filename_v = "cuc_ieschool.h264";
    	//const char *in_filename_a = "cuc_ieschool.mp3";
    	//const char *in_filename_a = "gowest.m4a";
    	//const char *in_filename_a = "gowest.aac";
    	const char *in_filename_a = "huoyuanjia.mp3";
    
    	const char *out_filename = "cuc_ieschool.mp4";//Output file URL
    	av_register_all();
    	//Input
    	if ((ret = avformat_open_input(&ifmt_ctx_v, in_filename_v, 0, 0)) < 0) {
    		printf( "Could not open input file.");
    		goto end;
    	}
    	if ((ret = avformat_find_stream_info(ifmt_ctx_v, 0)) < 0) {
    		printf( "Failed to retrieve input stream information");
    		goto end;
    	}
    
    	if ((ret = avformat_open_input(&ifmt_ctx_a, in_filename_a, 0, 0)) < 0) {
    		printf( "Could not open input file.");
    		goto end;
    	}
    	if ((ret = avformat_find_stream_info(ifmt_ctx_a, 0)) < 0) {
    		printf( "Failed to retrieve input stream information");
    		goto end;
    	}
    	printf("===========Input Information==========\n");
    	av_dump_format(ifmt_ctx_v, 0, in_filename_v, 0);
    	av_dump_format(ifmt_ctx_a, 0, in_filename_a, 0);
    	printf("======================================\n");
    	//Output
    	avformat_alloc_output_context2(&ofmt_ctx, NULL, NULL, out_filename);
    	if (!ofmt_ctx) {
    		printf( "Could not create output context\n");
    		ret = AVERROR_UNKNOWN;
    		goto end;
    	}
    	ofmt = ofmt_ctx->oformat;
    
    	for (i = 0; i < ifmt_ctx_v->nb_streams; i++) {
    		//Create output AVStream according to input AVStream
    		if(ifmt_ctx_v->streams[i]->codec->codec_type==AVMEDIA_TYPE_VIDEO){
    		AVStream *in_stream = ifmt_ctx_v->streams[i];
    		AVStream *out_stream = avformat_new_stream(ofmt_ctx, in_stream->codec->codec);
    		videoindex_v=i;
    		if (!out_stream) {
    			printf( "Failed allocating output stream\n");
    			ret = AVERROR_UNKNOWN;
    			goto end;
    		}
    		videoindex_out=out_stream->index;
    		//Copy the settings of AVCodecContext
    		if (avcodec_copy_context(out_stream->codec, in_stream->codec) < 0) {
    			printf( "Failed to copy context from input to output stream codec context\n");
    			goto end;
    		}
    		out_stream->codec->codec_tag = 0;
    		if (ofmt_ctx->oformat->flags & AVFMT_GLOBALHEADER)
    			out_stream->codec->flags |= CODEC_FLAG_GLOBAL_HEADER;
    		break;
    		}
    	}
    
    	for (i = 0; i < ifmt_ctx_a->nb_streams; i++) {
    		//Create output AVStream according to input AVStream
    		if(ifmt_ctx_a->streams[i]->codec->codec_type==AVMEDIA_TYPE_AUDIO){
    			AVStream *in_stream = ifmt_ctx_a->streams[i];
    			AVStream *out_stream = avformat_new_stream(ofmt_ctx, in_stream->codec->codec);
    			audioindex_a=i;
    			if (!out_stream) {
    				printf( "Failed allocating output stream\n");
    				ret = AVERROR_UNKNOWN;
    				goto end;
    			}
    			audioindex_out=out_stream->index;
    			//Copy the settings of AVCodecContext
    			if (avcodec_copy_context(out_stream->codec, in_stream->codec) < 0) {
    				printf( "Failed to copy context from input to output stream codec context\n");
    				goto end;
    			}
    			out_stream->codec->codec_tag = 0;
    			if (ofmt_ctx->oformat->flags & AVFMT_GLOBALHEADER)
    				out_stream->codec->flags |= CODEC_FLAG_GLOBAL_HEADER;
    
    			break;
    		}
    	}
    
    	printf("==========Output Information==========\n");
    	av_dump_format(ofmt_ctx, 0, out_filename, 1);
    	printf("======================================\n");
    	//Open output file
    	if (!(ofmt->flags & AVFMT_NOFILE)) {
    		if (avio_open(&ofmt_ctx->pb, out_filename, AVIO_FLAG_WRITE) < 0) {
    			printf( "Could not open output file '%s'", out_filename);
    			goto end;
    		}
    	}
    	//Write file header
    	if (avformat_write_header(ofmt_ctx, NULL) < 0) {
    		printf( "Error occurred when opening output file\n");
    		goto end;
    	}
    
    
    	//FIX
    #if USE_H264BSF
    	AVBitStreamFilterContext* h264bsfc =  av_bitstream_filter_init("h264_mp4toannexb"); 
    #endif
    #if USE_AACBSF
    	AVBitStreamFilterContext* aacbsfc =  av_bitstream_filter_init("aac_adtstoasc"); 
    #endif
    
    	while (1) {
    		AVFormatContext *ifmt_ctx;
    		int stream_index=0;
    		AVStream *in_stream, *out_stream;
    
    		//Get an AVPacket
    		if(av_compare_ts(cur_pts_v,ifmt_ctx_v->streams[videoindex_v]->time_base,cur_pts_a,ifmt_ctx_a->streams[audioindex_a]->time_base) <= 0){
    			ifmt_ctx=ifmt_ctx_v;
    			stream_index=videoindex_out;
    
    			if(av_read_frame(ifmt_ctx, &pkt) >= 0){
    				do{
    					in_stream  = ifmt_ctx->streams[pkt.stream_index];
    					out_stream = ofmt_ctx->streams[stream_index];
    
    					if(pkt.stream_index==videoindex_v){
    						//FIX:No PTS (Example: Raw H.264)
    						//Simple Write PTS
    						if(pkt.pts==AV_NOPTS_VALUE){
    							//Write PTS
    							AVRational time_base1=in_stream->time_base;
    							//Duration between 2 frames (us)
    							int64_t calc_duration=(double)AV_TIME_BASE/av_q2d(in_stream->r_frame_rate);
    							//Parameters
    							pkt.pts=(double)(frame_index*calc_duration)/(double)(av_q2d(time_base1)*AV_TIME_BASE);
    							pkt.dts=pkt.pts;
    							pkt.duration=(double)calc_duration/(double)(av_q2d(time_base1)*AV_TIME_BASE);
    							frame_index++;
    						}
    
    						cur_pts_v=pkt.pts;
    						break;
    					}
    				}while(av_read_frame(ifmt_ctx, &pkt) >= 0);
    			}else{
    				break;
    			}
    		}else{
    			ifmt_ctx=ifmt_ctx_a;
    			stream_index=audioindex_out;
    			if(av_read_frame(ifmt_ctx, &pkt) >= 0){
    				do{
    					in_stream  = ifmt_ctx->streams[pkt.stream_index];
    					out_stream = ofmt_ctx->streams[stream_index];
    
    					if(pkt.stream_index==audioindex_a){
    
    						//FIX:No PTS
    						//Simple Write PTS
    						if(pkt.pts==AV_NOPTS_VALUE){
    							//Write PTS
    							AVRational time_base1=in_stream->time_base;
    							//Duration between 2 frames (us)
    							int64_t calc_duration=(double)AV_TIME_BASE/av_q2d(in_stream->r_frame_rate);
    							//Parameters
    							pkt.pts=(double)(frame_index*calc_duration)/(double)(av_q2d(time_base1)*AV_TIME_BASE);
    							pkt.dts=pkt.pts;
    							pkt.duration=(double)calc_duration/(double)(av_q2d(time_base1)*AV_TIME_BASE);
    							frame_index++;
    						}
    						cur_pts_a=pkt.pts;
    
    						break;
    					}
    				}while(av_read_frame(ifmt_ctx, &pkt) >= 0);
    			}else{
    				break;
    			}
    
    		}
    
    		//FIX:Bitstream Filter
    #if USE_H264BSF
    		av_bitstream_filter_filter(h264bsfc, in_stream->codec, NULL, &pkt.data, &pkt.size, pkt.data, pkt.size, 0);
    #endif
    #if USE_AACBSF
    		av_bitstream_filter_filter(aacbsfc, out_stream->codec, NULL, &pkt.data, &pkt.size, pkt.data, pkt.size, 0);
    #endif
    
    
    		//Convert PTS/DTS
    		pkt.pts = av_rescale_q_rnd(pkt.pts, in_stream->time_base, out_stream->time_base, (AVRounding)(AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX));
    		pkt.dts = av_rescale_q_rnd(pkt.dts, in_stream->time_base, out_stream->time_base, (AVRounding)(AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX));
    		pkt.duration = av_rescale_q(pkt.duration, in_stream->time_base, out_stream->time_base);
    		pkt.pos = -1;
    		pkt.stream_index=stream_index;
    
    		printf("Write 1 Packet. size:%5d\tpts:%lld\n",pkt.size,pkt.pts);
    		//Write
    		if (av_interleaved_write_frame(ofmt_ctx, &pkt) < 0) {
    			printf( "Error muxing packet\n");
    			break;
    		}
    		av_free_packet(&pkt);
    
    	}
    	//Write file trailer
    	av_write_trailer(ofmt_ctx);
    
    #if USE_H264BSF
    	av_bitstream_filter_close(h264bsfc);
    #endif
    #if USE_AACBSF
    	av_bitstream_filter_close(aacbsfc);
    #endif
    
    end:
    	avformat_close_input(&ifmt_ctx_v);
    	avformat_close_input(&ifmt_ctx_a);
    	/* close output */
    	if (ofmt_ctx && !(ofmt->flags & AVFMT_NOFILE))
    		avio_close(ofmt_ctx->pb);
    	avformat_free_context(ofmt_ctx);
    	if (ret < 0 && ret != AVERROR_EOF) {
    		printf( "Error occurred.\n");
    		return -1;
    	}
    	return 0;
    }
    
    



    结果

    输入文件为:
    视频:cuc_ieschool.ts

    音频:huoyuanjia.mp3


    输出文件为:
    cuc_ieschool.mp4
    输出的文件视频为“cuc_ieschool”,配合“霍元甲”的音频。

    下载


    simplest ffmpeg format


    项目主页

    SourceForge:https://sourceforge.net/projects/simplestffmpegformat/

    Github:https://github.com/leixiaohua1020/simplest_ffmpeg_format

    开源中国:http://git.oschina.net/leixiaohua1020/simplest_ffmpeg_format


    CSDN下载:

    http://download.csdn.net/detail/leixiaohua1020/8005317


    工程中包含4个例子:

    simplest_ffmpeg_demuxer_simple:视音频分离器(简化版)。

    simplest_ffmpeg_demuxer:视音频分离器。

    simplest_ffmpeg_muxer:视音频复用器。

    simplest_ffmpeg_remuxer:封装格式转换器。


    更新-1.1==================================================

    修复了以下问题:

    (1)Release版本下的运行问题

    (2)simplest_ffmpeg_muxer封装H.264裸流的时候丢失声音的错误

    关于simplest_ffmpeg_muxer封装H.264裸流的时候丢失声音的问题目前已经解决。根源在于H.264裸流没有PTS,因此必须手动写入PTS。写入PTS的代码在在旧版本中已经包含:

    //FIX:No PTS
    //Simple Write PTS
    if(pkt.pts==AV_NOPTS_VALUE){
    	//Write PTS
    	AVRational time_base1=in_stream->time_base;
    	//Duration between 2 frames (us)
    	int64_t calc_duration=(double)AV_TIME_BASE/av_q2d(in_stream->r_frame_rate);
    	//Parameters
    	pkt.pts=(double)(frame_index*calc_duration)/(double)(av_q2d(time_base1)*AV_TIME_BASE);
    	pkt.dts=pkt.pts;
    	pkt.duration=(double)calc_duration/(double)(av_q2d(time_base1)*AV_TIME_BASE);
    	frame_index++;
    }
    但是旧版本中这段代码的位置放错了,应该放在av_read_frame()之后,cur_pts_a/cur_pts_v赋值之前。换句话说,也就说要把这段代码“前移”。修改后问题解决。

    CSDN下载地址:

    http://download.csdn.net/detail/leixiaohua1020/8284309


    更新-1.2 (2015.2.13)=========================================

    这次考虑到了跨平台的要求,调整了源代码。经过这次调整之后,源代码可以在以下平台编译通过:

    VC++:打开sln文件即可编译,无需配置。

    cl.exe:打开compile_cl.bat即可命令行下使用cl.exe进行编译,注意可能需要按照VC的安装路径调整脚本里面的参数。编译命令如下。

    ::VS2010 Environment
    call "D:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat"
    ::include
    @set INCLUDE=include;%INCLUDE%
    ::lib
    @set LIB=lib;%LIB%
    ::compile and link
    cl simplest_ffmpeg_muxer.cpp /link avcodec.lib avformat.lib avutil.lib ^
    avdevice.lib avfilter.lib postproc.lib swresample.lib swscale.lib /OPT:NOREF

    MinGW:MinGW命令行下运行compile_mingw.sh即可使用MinGW的g++进行编译。编译命令如下。

    g++ simplest_ffmpeg_muxer.cpp -g -o simplest_ffmpeg_muxer.exe \
    -I /usr/local/include -L /usr/local/lib -lavformat -lavcodec -lavutil

    GCC:Linux或者MacOS命令行下运行compile_gcc.sh即可使用GCC进行编译。编译命令如下。

    gcc simplest_ffmpeg_muxer.cpp -g -o simplest_ffmpeg_muxer.out -I /usr/local/include -L /usr/local/lib \
    -lavformat -lavcodec -lavutil
    PS:相关的编译命令已经保存到了工程文件夹中

    CSDN下载地址:http://download.csdn.net/detail/leixiaohua1020/8445303
    SourceForge上已经更新。
    展开全文
  • X2X Free Audio Trim是一个很简单的音频编辑器,可以将标记的音频片段另存、或将剩余的音频合并为一个独立文件,因此可以用X2X Free Audio Trim...X2X还有一个同样简单易用的视频剪辑工具以及视音频合并软件都还不错。
  • win10环境 ffmpeg下载地址 单个合并 直接在音视频目录运下面的命令 ffmpeg -i video.m4s -i audio.m4s -c:v copy -c:a aac -strict experimental output.mp4 批量合并 import os ... :param path: ...
  • 第一个视频无声,合并之后整个视频无声 例如上面是我用图片合成的视频,就是没有音频的视频。只要没有音频的视频放在最前面,那么整个视频都会没有声音,ffmpeg默认以第一个视频为标准。 解决方法:给第一个视频...
  • 一、使用RMAGUI1.3 这个软件其实就是RMA1.3的GUI图形界面版本,调用的是RMA1.3,只是图形界面更加清晰直观,比RMA的DOS... 软件完整下载地址: http://u.115.com/file/t64e547331 视音频分离器.rar 二、使用mkvtoo...
  • Boilsoft Video Joiner 是一款功能强大的视频、视频合并软件, 界面友好易用,支持常见的视音频格式,有不重新编码合并和重编码合并两种工作模式。 Boilsoft Video Joiner 的 Direct Stream Clone 即不重新编码模式...
  • FFmpeg音视频简单合并

    千次阅读 2020-01-16 17:36:32
    一、将原有视频的音频消除 ffmpeg.exe -i video原版.mp4 -vcodec copy -an ...ffmpeg.exe -i video去音频版.mp4 -i audio原版.mp3 -vcodec copy -acodec copy 音视频合并版.mp4 注: -i 输入您要处理的...
  • RMVB视频分割合并

    2009-12-08 17:19:07
    支持多数常用格式视音频文件的 切割 就 是可以分割成为小容量的小文件 精小实用,珍藏中!
  • 文件切割是一项很常见的基本功能,通过Ffmpeg可以很容易实现这项功能。  首先介绍下基本原理,文件切割说白了就过滤掉文件的部分音视频包,按照什么规则过滤呢?...戳区间,然后遍历视频文件中所有音...
  • 前面已经把视频成功的上传到我们的服务器,选择了背景音乐的ID,现在需要把视频和背景音乐进行合并,需要使用一个工具ffmpeg。...视音频处理工具,跨平台的视音频处理解决方案,主页:http://ffmpeg.org 应...
  • Boilsoft Video Joiner_7.02.2

    2016-01-06 14:08:27
    Boilsoft Video Joiner是一款功能强大的视频、视频合并软件, 界面友好易用,支持常见的视音频格式,有不重新编码合并和重编码合并两种工作模式。
  • Boilsoft Video Joiner是一款功能强大的视频、视频合并软件, 界面友好易用,支持大部分常见视音频格式,有不重新编码合并和重新编码两种合并模式,能让您高效的合并您的视频 这个真心好用,可以说是视频合并里最...
  • FreeVideoJoinerV1.exe

    2020-03-13 23:51:58
    支持多种格式的单视频合并成并压缩成一个大的视频文件,它是一款功能强大的视频、视频合并软件, 界面友好易用,支持常见的视音频格式
  • Android录音与播放

    2019-09-30 11:44:01
    Android多媒体框架包含获取和编码多种音频格式的支持,所以你可以轻松地把音频合并到你的应用中.如果设备支持,你可以使用MediaRecorderAPIs进行录音. 本章向你展示如何写一个应用从设备上的microphone获取音频,...
  • PR 2019 快速入门(6)

    2020-08-05 20:53:02
    2.11一秒钟同步视音频 同时点击需要的视频和音频,单击右键,合并剪辑,选择音频,以音频为准来合并视频 2.12多机位剪辑技巧 选中需要的剪辑素材,单击右键,创建多机位源系列,以音频方式进行匹配 点击设置 视频...
  • SolveigMM Video Splitter...此程序的操作是无损且快速的,通过点击几下鼠标就能准确无误的去除视频中不想要的部分,切除和合并视音频流的操作也能通过鼠标完美的进行,且喜人直观的友好界面可以使用户很容易的使用它。
  • 1.[总结]FFMPEG视音频编解码零基础学习方法 2. 最简单的基于libVLC的例子:最简单的基于libVLC的视频播放器 3.ffmpeg裁剪合并视频 4.ffmpeg分割视频的方法 5.ffmpeg命令详解 6.ffmpeg 合并视频文件 --------...
  • tf27: Deep Dream—应用到视频

    千次阅读 2016-12-26 13:36:05
    前帖实现谷歌Deep Dream>可以生成扭曲的图像,本帖就基于前一贴的代码在视频上应用Deep Dream,应该...使用ffmpeg把帧图像重新组合成视频,最后和音频合并 生成的视频效果(https://youtu.be/Sy9PXSXfEOA) 原始
  • FFMPEG+QT仿格式工厂

    2017-09-03 17:23:19
    QT+FFMPEG仿格式工厂,具体使用参考格式工厂。...2视频摄像头功能在某些电脑录制的视频存在视音频不同步现象。3程序在添加视频文件时有可能导致程序崩溃。4视频分割和视频合并功能对某些视频不能正常使用。
  • FFMPEG Filter介绍

    千次阅读 2016-05-13 10:11:41
    AVFilter的功能十分强大,可以实现对多媒体数据的各种处理,包括时间线编辑、视音频特效滤镜的添加或信号处理,还可以实现多路媒体流的合并或叠加,其丰富程度令人叹为观止。这里主要以视频滤镜为例进行介绍。使用...
  • AVFilter的功能十分强大,可以实现对多媒体数据的各种处理,包括时间线编辑、视音频特效滤镜的添加或信号处理,还可以实现多路媒体流的合并或叠加,其丰富程度令人叹为观止。这里主要以视频滤镜为例进行介绍。使用...
  • SolveigMM Video Splitter...此程序的操作是无损且快速的,通过点击几下鼠标就能准确无误的去除视频中不想要的部分,切除和合并视音频流的操作也能通过鼠标完美的进行,且喜人直观的友好界面可以使用户很容易的使用它。
  • SolveigMM Video Splitter...此程序的操作是无损且快速的,通过点击几下鼠标就能准确无误的去除视频中不想要的部分,切除和合并视音频流的操作也能通过鼠标完美的进行,且喜人直观的友好界面可以使用户很容易的使用它。

空空如也

空空如也

1 2 3
收藏数 53
精华内容 21
关键字:

视音频合并