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

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

這篇具有很好參考價值的文章主要介紹了2023-05-04:用go語言重寫ffmpeg的scaling_video.c示例,用于實現(xiàn)視頻縮放(Scaling)功能。。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

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

答案2023-05-04:

這段代碼實現(xiàn)了使用 libswscale 庫進(jìn)行視頻縮放的功能。下面是程序的主要流程:

1.獲取命令行參數(shù),包括輸出文件名和目標(biāo)圖像大小。

2.解析目標(biāo)圖像大小,生成指定大小的輸出文件。

3.創(chuàng)建縮放上下文(scaling context)并分配輸入和輸出圖像數(shù)據(jù)的內(nèi)存空間。

4.循環(huán)生成合成圖像、將輸入圖像轉(zhuǎn)換為輸出圖像并將輸出圖像寫入輸出文件中,重復(fù)該操作若干次。

5.釋放內(nèi)存空間并關(guān)閉輸出文件。

具體步驟如下:

1.獲取命令行參數(shù)。首先檢查命令行參數(shù)是否符合要求,如果不符合則打印使用說明并退出程序。否則,解析輸出文件名和目標(biāo)圖像大小。

2.解析目標(biāo)圖像大小。調(diào)用 libavutil.AvParseVideoSize() 函數(shù)解析目標(biāo)圖像大小,并根據(jù)解析結(jié)果生成一個指定大小的輸出文件。

3.創(chuàng)建縮放上下文并分配內(nèi)存空間。調(diào)用 libswscale.SwsGetContext() 函數(shù)創(chuàng)建一個縮放上下文,并使用 libavutil.AvImageAlloc() 函數(shù)分配輸入和輸出圖像數(shù)據(jù)的內(nèi)存空間。

4.循環(huán)處理圖像。在循環(huán)中,首先生成一個 YUV420P 格式的合成圖像。然后,調(diào)用 libswscale.SwsScale() 函數(shù)將輸入圖像轉(zhuǎn)換為輸出圖像。最后,將輸出圖像寫入輸出文件中。在本程序中,處理圖像的循環(huán)次數(shù)為 100 次。

5.釋放內(nèi)存空間并關(guān)閉輸出文件。在程序結(jié)束時,需要釋放輸入和輸出圖像數(shù)據(jù)的內(nèi)存空間,并關(guān)閉輸出文件。

整個程序的主要目的是演示如何使用 libswscale 庫進(jìn)行視頻縮放。它通過調(diào)用 libswscale 庫的函數(shù) SwsGetContext()SwsScale() 實現(xiàn)了將一系列輸入圖像轉(zhuǎn)換為指定大小的輸出圖像的功能。

代碼見github/moonfdd/ffmpeg-go庫。

命令如下:

go run ./examples/internalexamples/scaling_video/main.go ./out/big_buck_bunny.mp4 640*480

./lib/ffplay -f rawvideo -pix_fmt rgb24 -video_size 640x480 ./out/big_buck_bunny.mp4

golang代碼如下:

package main

import (
	"fmt"
	"os"
	"unsafe"

	"github.com/moonfdd/ffmpeg-go/ffcommon"
	"github.com/moonfdd/ffmpeg-go/libavutil"
	"github.com/moonfdd/ffmpeg-go/libswscale"
)

func main0() (ret ffcommon.FInt) {
	var src_data, dst_data [4]*ffcommon.FUint8T
	var src_linesize, dst_linesize [4]ffcommon.FInt
	var src_w ffcommon.FInt = 320
	var src_h ffcommon.FInt = 240
	var dst_w ffcommon.FInt
	var dst_h ffcommon.FInt
	var src_pix_fmt libavutil.AVPixelFormat = libavutil.AV_PIX_FMT_YUV420P
	var dst_pix_fmt libavutil.AVPixelFormat = libavutil.AV_PIX_FMT_RGB24
	var dst_size string
	var dst_filename string
	var dst_file *os.File
	var dst_bufsize ffcommon.FInt
	var sws_ctx *libswscale.SwsContext
	var i ffcommon.FInt

	if len(os.Args) != 3 {
		fmt.Printf("Usage: %s output_file output_size\nAPI example program to show how to scale an image with libswscale.\nThis program generates a series of pictures, rescales them to the given output_size and saves them to an output file named output_file\n.\n", os.Args[0])
		os.Exit(1)
	}
	dst_filename = os.Args[1]
	dst_size = os.Args[2]

	if libavutil.AvParseVideoSize(&dst_w, &dst_h, dst_size) < 0 {
		fmt.Printf("Invalid size '%s', must be in the form WxH or a valid size abbreviation\n",
			dst_size)
		os.Exit(1)
	}

	dst_file, _ = os.Create(dst_filename)
	if dst_file == nil {
		fmt.Printf("Could not open destination file %s\n", dst_filename)
		os.Exit(1)
	}

	/* create scaling context */
	sws_ctx = libswscale.SwsGetContext(src_w, src_h, src_pix_fmt,
		dst_w, dst_h, dst_pix_fmt,
		libswscale.SWS_BILINEAR, nil, nil, nil)
	if sws_ctx == nil {
		fmt.Printf(
			"Impossible to create scale context for the conversion fmt:%s s:%dx%d -> fmt:%s s:%dx%d\n",
			libavutil.AvGetPixFmtName(src_pix_fmt), src_w, src_h,
			libavutil.AvGetPixFmtName(dst_pix_fmt), dst_w, dst_h)
		ret = -libavutil.EINVAL
		goto end
	}

	/* allocate source and destination image buffers */
	ret = libavutil.AvImageAlloc(&src_data, &src_linesize,
		src_w, src_h, src_pix_fmt, 16)
	if ret < 0 {
		fmt.Printf("Could not allocate source image\n")
		goto end
	}

	/* buffer is going to be written to rawvideo file, no alignment */
	ret = libavutil.AvImageAlloc(&dst_data, &dst_linesize,
		dst_w, dst_h, dst_pix_fmt, 1)
	if ret < 0 {
		fmt.Printf("Could not allocate destination image\n")
		goto end
	}
	dst_bufsize = ret

	for i = 0; i < 100; i++ {
		// /* generate synthetic video */
		fill_yuv_image(&src_data, &src_linesize, src_w, src_h, i)

		/* convert to destination format */
		sws_ctx.SwsScale((**byte)(unsafe.Pointer(&src_data)),
			(*int32)(unsafe.Pointer(&src_linesize)), 0, uint32(src_h), (**byte)(unsafe.Pointer(&dst_data)), (*int32)(unsafe.Pointer(&dst_linesize)))

		// /* write scaled image to file */
		dst_file.Write(ffcommon.ByteSliceFromByteP(dst_data[0], int(dst_bufsize)))
	}

	fmt.Printf("Scaling succeeded. Play the output file with the command:\nffplay -f rawvideo -pix_fmt %s -video_size %dx%d %s\n",
		libavutil.AvGetPixFmtName(dst_pix_fmt), dst_w, dst_h, dst_filename)

end:
	dst_file.Close()
	libavutil.AvFreep(uintptr(unsafe.Pointer(&src_data[0])))
	libavutil.AvFreep(uintptr(unsafe.Pointer(&dst_data[0])))
	sws_ctx.SwsFreeContext()
	if ret < 0 {
		return 1
	} else {
		return 0
	}
}

func fill_yuv_image(data *[4]*ffcommon.FUint8T, linesize *[4]ffcommon.FInt, width, height, frame_index ffcommon.FInt) {
	var x, y ffcommon.FInt

	/* Y */
	for y = 0; y < height; y++ {
		for x = 0; x < width; x++ {
			//data[0][y*linesize[0]+x] = x + y + frame_index*3
			*(*byte)(unsafe.Pointer(uintptr(unsafe.Pointer(data[0])) + uintptr(y*linesize[0]+x))) = byte((x + y + frame_index*3) % 256)
		}
	}

	/* Cb and Cr */
	for y = 0; y < height/2; y++ {
		for x = 0; x < width/2; x++ {
			// data[1][y * linesize[1] + x] = 128 + y + frame_index * 2;
			// data[2][y * linesize[2] + x] = 64 + x + frame_index * 5;
			*(*byte)(unsafe.Pointer(uintptr(unsafe.Pointer(data[1])) + uintptr(y*linesize[1]+x))) = byte((128 + y + frame_index*2) % 256)
			*(*byte)(unsafe.Pointer(uintptr(unsafe.Pointer(data[2])) + uintptr(y*linesize[2]+x))) = byte((64 + x + frame_index*5) % 256)
		}
	}
}

func main() {

	os.Setenv("Path", os.Getenv("Path")+";./lib")
	ffcommon.SetAvutilPath("./lib/avutil-56.dll")
	ffcommon.SetAvcodecPath("./lib/avcodec-58.dll")
	ffcommon.SetAvdevicePath("./lib/avdevice-58.dll")
	ffcommon.SetAvfilterPath("./lib/avfilter-56.dll")
	ffcommon.SetAvformatPath("./lib/avformat-58.dll")
	ffcommon.SetAvpostprocPath("./lib/postproc-55.dll")
	ffcommon.SetAvswresamplePath("./lib/swresample-3.dll")
	ffcommon.SetAvswscalePath("./lib/swscale-5.dll")

	genDir := "./out"
	_, err := os.Stat(genDir)
	if err != nil {
		if os.IsNotExist(err) {
			os.Mkdir(genDir, 0777) //  Everyone can read write and execute
		}
	}

	main0()
}

2023-05-04:用go語言重寫ffmpeg的scaling_video.c示例,用于實現(xiàn)視頻縮放(Scaling)功能。文章來源地址http://www.zghlxwxcb.cn/news/detail-433642.html

到了這里,關(guān)于2023-05-04:用go語言重寫ffmpeg的scaling_video.c示例,用于實現(xiàn)視頻縮放(Scaling)功能。的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【go語言學(xué)習(xí)筆記】05 Go 語言實戰(zhàn)

    【go語言學(xué)習(xí)筆記】05 Go 語言實戰(zhàn)

    在做項目開發(fā)的時候,要善于借助已經(jīng)有的輪子,讓自己的開發(fā)更有效率,也更容易實現(xiàn)。 1. RESTful API 定義 RESTful API 是一套規(guī)范,它可以規(guī)范如何對服務(wù)器上的資源進(jìn)行操作。和 RESTful API 和密不可分的是 HTTP Method。 1.1 HTTP Method HTTP Method最常見的就是POST和GET,其實最早在

    2024年02月13日
    瀏覽(23)
  • WuThreat身份安全云-TVD每日漏洞情報-2023-05-04

    漏洞名稱:BIG-IP TMUI XSS vulnerability(CVE-2023-27378) 漏洞級別:高危 漏洞編號:CVE-2023-27378 相關(guān)涉及:None 漏洞狀態(tài):未定義 參考鏈接:https://tvd.wuthreat.com/#/listDetail?TVD_ID=TVD-2023-10858 漏洞名稱:Jenkins view-cloner Plugin 信息泄露 漏洞級別:中危 漏洞編號:CVE-2023-2445 相關(guān)涉及:Jenkins view-cloner Plugin

    2024年02月10日
    瀏覽(17)
  • mulesoft MCIA 破釜沉舟備考 2023.05.04.30(易錯題)

    mulesoft MCIA 破釜沉舟備考 2023.05.04.30(易錯題)

    A. Enabling Edge security between the lines of business and public devices B. Centralizing project management across the lines of business C. Centrally managing return on investment (ROI) reporting from lines of business to leadership D. Accelerating self-service by the lines of business Answer: B According to MuleSoft, which business benefits is associated

    2024年02月03日
    瀏覽(17)
  • 【Linux】Ubuntu20.04版本配置pytorch環(huán)境2023.09.05【教程】

    【Linux】Ubuntu20.04版本配置pytorch環(huán)境2023.09.05【教程】

    首先進(jìn)入Anaconda官網(wǎng)下載linux版本的安裝文件 Anaconda3-2023.07-2-Linux-x86_64.sh ,進(jìn)入安裝文件路徑,運行下面的腳本進(jìn)行安裝 安裝需要閱讀用戶協(xié)議,一直按 enter 就行了,到當(dāng)前頁面時需要輸出 yes 進(jìn)行確認(rèn)即可開始安裝。 然后按照提示進(jìn)行操作即可完成安裝。 Anaconda基本環(huán)境管

    2024年02月09日
    瀏覽(31)
  • 關(guān)于出版《AR Foundation增強現(xiàn)實開發(fā)實戰(zhàn)(ARKit版)》(2023-04-05更新)

    關(guān)于出版《AR Foundation增強現(xiàn)實開發(fā)實戰(zhàn)(ARKit版)》(2023-04-05更新)

    感謝各位讀者的支持,書籍目前已上市各大電商平臺。 ----------- 2022年9月11日創(chuàng)建 --------- ??ARKit是蘋果公司在前沿科技領(lǐng)域的重大技術(shù)布局,也是目前移動領(lǐng)域AR應(yīng)用開發(fā)引擎標(biāo)桿。得益于良好的軟硬件生態(tài)整合,ARKit運動跟蹤穩(wěn)定性好、性能消耗低、功能特性豐富,利用它

    2023年04月09日
    瀏覽(23)
  • Rasa 3.x 學(xué)習(xí)系列-Rasa [3.5.4] -2023-04-05新版本發(fā)布

    Rasa 3.x 學(xué)習(xí)系列-Rasa [3.5.4] -2023-04-05新版本發(fā)布

    Rasa 3.x 學(xué)習(xí)系列-Rasa [3.5.4] -2023-04-05新版本發(fā)布 Rasa Pro 3.5 中引入的兩項新功能將幫助您更好地測試和保護(hù)您的 AI 助手:端到端測試和機密管理。 通過全面的驗收和集成測試評估 AI 助手的性能。我們易于更新的端到端測試可以設(shè)置為運行每個流程和集成,以幫助您自信地部署

    2023年04月10日
    瀏覽(20)
  • 【go語言學(xué)習(xí)筆記】04 Go 語言工程管理

    【go語言學(xué)習(xí)筆記】04 Go 語言工程管理

    1. 單元測試 單元測試是保證代碼質(zhì)量的好方法,但單元測試也不是萬能的,使用它可以降低 Bug 率,但也不要完全依賴。除了單元測試外,還可以輔以 Code Review、人工測試等手段更好地保證代碼質(zhì)量。 1.1 定義 顧名思義,單元測試強調(diào)的是對單元進(jìn)行測試。在開發(fā)中,一個單

    2024年02月13日
    瀏覽(24)
  • 2023-05-20青少年軟件編程(C語言)等級考試試卷(一級)解析

    2023-05-20青少年軟件編程(C語言)等級考試試卷(一級)解析 T1、輸出第二個整數(shù) 輸入三個整數(shù),把第二個輸入的整數(shù)輸出。 時間限制:1000 內(nèi)存限制:65536 輸入 只有一行,共三個整數(shù),整數(shù)之間由一個空格分隔。整數(shù)是32位有符號整數(shù)。 輸出 只有一行,一個整數(shù),即輸入

    2024年02月09日
    瀏覽(94)
  • VScode下配置Go語言開發(fā)環(huán)境【2023最新】

    VScode下配置Go語言開發(fā)環(huán)境【2023最新】

    本文主要記錄了 Go 的安裝,以及給 vscode 配置 Go 的環(huán)境。 截圖比較多所以顯得文章比較長。如有錯誤歡迎指出~ 系統(tǒng):Windows 10 go:1.20.6 vscode:June 2023 (version 1.80) 下載鏈接:Go下載 下載和系統(tǒng)對應(yīng)的版本,我是 windows 所以選擇了下圖的這個。選的是最新的穩(wěn)定版本 go1.20.6:

    2024年02月15日
    瀏覽(23)
  • R語言、04 案例P143 Go bananas、《商務(wù)與經(jīng)濟(jì)統(tǒng)計》案例題

    編程教材 《R語言實戰(zhàn)·第2版》Robert I. Kabacoff 課程教材 《商務(wù)與經(jīng)濟(jì)統(tǒng)計·原書第13版》 (安德森) 每周有4.5%的概率會中斷生產(chǎn),考慮到企業(yè)利潤,時間就是金錢。大部分公司生產(chǎn)線日產(chǎn)量是以萬為單位的,暫停生產(chǎn)線進(jìn)行調(diào)試對食品公司來說是極大的損失。應(yīng)當(dāng)修改策略方案

    2024年01月20日
    瀏覽(17)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包