国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

使用FFMpeg實現視頻剪切功能

這篇具有很好參考價值的文章主要介紹了使用FFMpeg實現視頻剪切功能。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

首先致敬雷神提供的資源,使用雷神的代碼實現視頻剪切功能

雷神實現的ffmpeg代碼文章

說明一下,這里轉載首先是記錄一下實現方法,其次就是解決代碼無法正常運行問題(avformat_write_header返回-22)

本文介紹一個基于FFMPEG的封裝格式轉換器。所謂的封裝格式轉換,就是在AVI,FLV,MKV,MP4這些格式之間轉換(對應.avi,.flv,.mkv,.mp4文件)。需要注意的是,本程序并不進行視音頻的編碼和解碼工作。而是直接將視音頻壓縮碼流從一種封裝格式文件中獲取出來然后打包成另外一種封裝格式的文件。傳統的轉碼程序工作原理如下圖所示:
使用FFMpeg實現視頻剪切功能
上圖例舉了一個舉例:FLV(視頻:H.264,音頻:AAC)轉碼為AVI(視頻:MPEG2,音頻MP3)的例子。可見視頻轉碼的過程通俗地講相當于把視頻和音頻重新“錄”了一遍。

本程序的工作原理如下圖所示:
使用FFMpeg實現視頻剪切功能
由圖可見,本程序并不進行視頻和音頻的編解碼工作,因此本程序和普通的轉碼軟件相比,有以下兩個特點:
處理速度極快。視音頻編解碼算法十分復雜,占據了轉碼的絕大部分時間。因為不需要進行視音頻的編碼和解碼,所以節(jié)約了大量的時間。
視音頻質量無損。因為不需要進行視音頻的編碼和解碼,所以不會有視音頻的壓縮損傷。


#include <stdio.h>
extern "C"
{
#include <FFmpeg\libavcodec\avcodec.h>
#include <FFmpeg\libavformat\avformat.h>
}
#pragma comment (lib, "avcodec.lib")
#pragma comment (lib, "avformat.lib")
#pragma comment (lib, "avutil.lib")

int main(int argc, char* argv[])
{
	int startTime = 1;//起始時間  如果為0就不啟用該變量
	int endTime = 4;//結束時間   如果為0就不啟用該變量
	AVCodecContext* pCodecCtx = NULL;
	AVCodecContext *pAVCodecContext = NULL;
	AVOutputFormat *ofmt = NULL;
	AVFormatContext *ifmt_ctx = NULL, *ofmt_ctx = NULL;
	AVPacket pkt;
	const char *in_filename, *out_filename;
	int ret, i;

	in_filename = "e://Test.mp4";
	out_filename = "e://Temp.mp4";
	av_register_all();
	//輸入(Input)
	if ((ret = avformat_open_input(&ifmt_ctx, in_filename, 0, 0)) < 0) {
		printf("Could not open input file.");
		goto end;
	}
	if ((ret = avformat_find_stream_info(ifmt_ctx, 0)) < 0) {
		printf("Failed to retrieve input stream information");
		goto end;
	}
	av_dump_format(ifmt_ctx, 0, in_filename, 0);
	//輸出(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->nb_streams; i++) {
		//根據輸入流創(chuàng)建輸出流(Create output AVStream according to input AVStream)
		AVStream *in_stream = ifmt_ctx->streams[i];
		AVStream *out_stream = avformat_new_stream(ofmt_ctx, in_stream->codec->codec);
		if (!out_stream) {
			printf("Failed allocating output stream\n");
			ret = AVERROR_UNKNOWN;
			goto end;
		}
		ret = avcodec_copy_context(out_stream->codec, in_stream->codec);
		if (ret < 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 |= AV_CODEC_FLAG_GLOBAL_HEADER;
		//Param that must set
		pCodecCtx = out_stream->codec;
		
		/*
			//特殊處理 
			如果使用雷神的代碼這里不增加特殊的處理,會在avformat_write_header函數執(zhí)行的時候
			返回-22
			i=0: codec_id = AV_CODEC_ID_HEV //H265
			i=1:codec_id = AV_CODEC_ID_AAC
			i=2:codec_id = AV_CODEC_ID_NONE
			i=3:codec_id = AV_CODEC_ID_NONE
			i=4:codec_id = AV_CODEC_ID_NONE
		*/
		pAVCodecContext = ifmt_ctx->streams[i]->codec;
		if (i < 2)
			pCodecCtx->codec_id = ifmt_ctx->streams[i]->codec->codec_id;
		else
			pCodecCtx->codec_id = ifmt_ctx->streams[i%2]->codec->codec_id;
		
#if 0
		//其他參數配置
		pCodecCtx->codec_type = AVMEDIA_TYPE_VIDEO;
		pCodecCtx->pix_fmt = AV_PIX_FMT_YUV420P;
		pCodecCtx->width = 1920;
		pCodecCtx->height = 1080;
		pCodecCtx->bit_rate = pAVCodecContext->bit_rate;
		pCodecCtx->gop_size = 250;
		pCodecCtx->time_base.num = 1;
		pCodecCtx->time_base.den = 25;
		pCodecCtx->qmin = 10;
		pCodecCtx->qmax = 51;
		//Optional Param
		pCodecCtx->max_b_frames = 3;
#endif
	}
	pAVCodecContext = ifmt_ctx->streams[0]->codec;
	// 顯示視頻相關的參數信息(編碼上下文)
	printf("比特率: = %lld\n", pAVCodecContext->bit_rate);
	printf("寬高: = %d\n" , pAVCodecContext->width );
	printf("格式: = %d\n" , pAVCodecContext->pix_fmt);  // AV_PIX_FMT_YUV420P 0
	printf("幀率: = %d\n",pAVCodecContext->time_base.den );
	printf("總時長: = %f s\n", (ifmt_ctx->duration) / AV_TIME_BASE );
	printf("總幀數: = %d\n", ifmt_ctx->streams[0]->nb_frames );
	int fps = ifmt_ctx->streams[0]->avg_frame_rate.num * 1.0f / ifmt_ctx->streams[0]->avg_frame_rate.den;
	int interval = 1 * 1000 / fps;
	printf("平均幀率: = %d\n", fps );
	printf("幀間隔: = %d ms\n", interval);

	//輸出一下格式------------------
	av_dump_format(ofmt_ctx, 0, out_filename, 1);
	//打開輸出文件(Open output file)
	if (!(ofmt->flags & AVFMT_NOFILE)) {
		ret = avio_open(&ofmt_ctx->pb, out_filename, AVIO_FLAG_WRITE);
		if (ret < 0) {
			printf("Could not open output file '%s'", out_filename);
			goto end;
		}
	}
	//寫文件頭(Write file header)
	ret = avformat_write_header(ofmt_ctx, NULL);
	if (ret < 0) {
		printf("Error occurred when opening output file\n");
		goto end;
	}

	//跳轉到多少秒
	if(startTime <= 0)
	{
		ret = av_seek_frame(ifmt_ctx, -1, startTime * AV_TIME_BASE, AVSEEK_FLAG_ANY);
		if (ret<0) {
			fprintf(stderr, "Error seek\n");
		}
	}
	

	int frame_index = 0;
	while (1) {
		AVStream *in_stream, *out_stream;

		//獲取一個AVPacket(Get an AVPacket)
		ret = av_read_frame(ifmt_ctx, &pkt);
		if (ret < 0)
			break;
		in_stream = ifmt_ctx->streams[pkt.stream_index];
		out_stream = ofmt_ctx->streams[pkt.stream_index];


		//裁剪區(qū)域
		if (endTime > startTime)
		{
			if (av_q2d(in_stream->time_base) * pkt.pts > (startTime + endTime))
			{
				av_packet_unref(&pkt);
				break;
			}
		}
		/* copy packet */
		//轉換PTS/DTS(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;
		//寫入(Write)
		ret = av_interleaved_write_frame(ofmt_ctx, &pkt);
		if (ret < 0) {
			printf("Error muxing packet\n");
			break;
		}
		printf("Write %8d frames to output file\n", frame_index);
		av_free_packet(&pkt);
		frame_index++;
	}
	//寫文件尾(Write file trailer)
	av_write_trailer(ofmt_ctx);
end:
	avformat_close_input(&ifmt_ctx);
	/* 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;
}

轉:文章資源:https://blog.csdn.net/leixiaohua1020/article/details/84597944

完整工程下載地址(代碼是一樣的,就是包含了ffmpeg運行所需要的環(huán)境,能直接編譯通過):
https://download.csdn.net/download/qq_36351159/85748703
工程項目VS2015 x64 Debug下載 (包括ffmpeg庫,配置好的所需包含目錄、庫,可直接編譯)文章來源地址http://www.zghlxwxcb.cn/news/detail-406531.html

到了這里,關于使用FFMpeg實現視頻剪切功能的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 純前端使用ffmpeg實現視頻壓縮

    純前端使用ffmpeg實現視頻壓縮

    實現需求 用戶上傳視頻并壓縮,并且可以選擇壓縮程度,搜索遍各大網站,最終選擇了ffmpeg進行操作。本文包含具體如何實現加上過程中遇到的各種坑 ffmpeg視頻壓縮代碼使用很簡單,上代碼 html部分 ?js部分 這個ffmpeg大神處理好的cdn我也是找了好久才找到,之前找的各種版本

    2024年02月04日
    瀏覽(18)
  • 2023-05-04:用go語言重寫ffmpeg的scaling_video.c示例,用于實現視頻縮放(Scaling)功能。

    2023-05-04:用go語言重寫ffmpeg的scaling_video.c示例,用于實現視頻縮放(Scaling)功能。

    2023-05-04:用go語言重寫ffmpeg的scaling_video.c示例,用于實現視頻縮放(Scaling)功能。 答案2023-05-04: 這段代碼實現了使用 libswscale 庫進行視頻縮放的功能。下面是程序的主要流程: 1.獲取命令行參數,包括輸出文件名和目標圖像大小。 2.解析目標圖像大小,生成指定大小的輸出

    2024年02月02日
    瀏覽(19)
  • 【Unity復制功能】Unity復制到剪切板三端實現方法

    【Unity復制功能】Unity復制到剪切板三端實現方法

    一、安卓和IOS方案 直接使用Unity提供的GUIUtility.systemCopyBuffer方案 鏈接: https://docs.unity.cn/cn/2021.3/ScriptReference/GUIUtility.html 例如: 二、小程序(WebGL) 1、web這邊需要定義復制接口:WebSetCopy 2、Unity這邊 首先定義方法調用web接口 然后在膠水函數中聲明

    2024年04月16日
    瀏覽(13)
  • 使用ffmpeg實現給音頻,視頻添加水印的操作

    使用ffmpeg實現給音頻,視頻添加水印的操作

    本文主要針對ffmpeg進行整理,從而解決在現實中可能存在的問題。 這里參考的是 Java后臺用ffmpeg命令給視頻添加水印 - ^身后有尾巴^ - 博客園 (cnblogs.com) 1:先去ffmpeg官網下載其壓縮包??Download FFmpeg 下載,解壓到指定位置? 2.將壓縮包拷貝到你想的任意位置并解壓,正常解壓出

    2023年04月08日
    瀏覽(21)
  • 使用ffmpeg實現視頻旋轉并保持清晰度不變

    使用ffmpeg實現視頻旋轉并保持清晰度不變

    通過ffmpeg -i命令查看視頻基本信息 通過命令查看,原始視頻信息 分辨率為1920x1080,碼率19977k, 幀率59.94 -qscale value:使用固定的視頻量化標度(VBR),以value質量為基礎的VBR,取值0.01-255,越小質量越好 -q:v:表示存儲jpeg的圖像質量 -b:v:設置輸出文件的視頻比特率(碼率),本

    2024年01月25日
    瀏覽(19)
  • Windows上使用FFmpeg實現本地視頻推送模擬海康協議rtsp視頻流

    Windows上使用FFmpeg實現本地視頻推送模擬??祬f議rtsp視頻流

    Nginx搭建RTMP服務器+FFmpeg實現海康威視攝像頭預覽: Nginx搭建RTMP服務器+FFmpeg實現??低晹z像頭預覽_nginx rtmp ??禂z像頭_霸道流氓氣質的博客-CSDN博客 上面記錄的是使用FFmpeg拉取??祬f議攝像頭的rtsp流并推流到流媒體服務器。 如果在其它業(yè)務場景下需要本地的視頻文件模擬

    2024年02月12日
    瀏覽(22)
  • Android 使用FFmpeg3.3.9基于命令實現視頻壓縮

    Android 使用FFmpeg3.3.9基于命令實現視頻壓縮

    前言 首先利用linux平臺編譯ffmpeg的so庫,具體詳情請查看文章:Android NDK(ndk-r16b)交叉編譯FFmpeg(3.3.9)_jszlittlecat_720的博客-CSDN博客 ? ?點擊Create JNI function for compressVideo 自動打開native-lib.cpp并創(chuàng)建完成Java_com_suoer_ndk_ffmpegtestapplication_VideoCompress_compressVideo 方法 ?在此方法下實現壓縮

    2024年02月02日
    瀏覽(28)
  • 音視頻開發(fā):ffplay使用ffmpeg濾鏡實現倍速播放

    曾經為實現倍速播放使用過ffmpeg,對音頻使用atempo濾鏡即可實現變速不變調。但是當時效果并不是特別好,和soundtouch相比處理后的音質有明顯的區(qū)別。最近用新版本的ffmpeg濾鏡重新實現了倍速播放,發(fā)現效果變好,已經達到可接受的程度,所以在此分享具體實現。 ffmpeg倍速

    2024年02月03日
    瀏覽(72)
  • 【JS】純web端使用ffmpeg實現的視頻編輯器

    【JS】純web端使用ffmpeg實現的視頻編輯器

    廢話不多,先上視頻。 ffmpeg編輯器 這是一個純前端實現的視頻編輯器,用的ffmpeg的wasm,web框架用的vue3。界面手擼。 用vite的vue3模板創(chuàng)建一個就可以。 package.json 創(chuàng)建頁面和路由,用的vue-router,簡單的添加一下。 router.js 主要項目結構 組件代碼 progress-dialog.vue resource-item.vue t

    2024年02月12日
    瀏覽(22)
  • 使用EasyDarwin + ffmpeg 搭建流媒體服務器,實現多臺智能電視同步播放宣傳視頻

    使用EasyDarwin + ffmpeg 搭建流媒體服務器,實現多臺智能電視同步播放宣傳視頻

    近期單位用戶提出需求,需要在單位內部的9臺安卓智能電視(小米電視)上同步播放用戶提供的宣傳視頻,希望能夠做到所有電視音視頻同步播放(電視均位于食堂內部,使用內置揚聲器,各電視間音頻延遲不同會導致混響) 。 由于電視在安裝時只預留了電源線,使用HDM

    2024年02月10日
    瀏覽(107)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包