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

JavaCV:將任意視頻轉碼為h264編碼的mp4格式視頻

這篇具有很好參考價值的文章主要介紹了JavaCV:將任意視頻轉碼為h264編碼的mp4格式視頻。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

視頻工具類

import org.bytedeco.ffmpeg.avcodec.AVCodecParameters;
import org.bytedeco.ffmpeg.avformat.AVFormatContext;
import org.bytedeco.ffmpeg.avformat.AVStream;
import org.bytedeco.ffmpeg.global.avcodec;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.FFmpegFrameRecorder;
import org.bytedeco.javacv.FFmpegLogCallback;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.FrameGrabber;

/**
 * 視頻工具類
 * 
 * @author alderaan
 * @version 創(chuàng)建時間:2022年5月10日 下午3:43:18
 *
 */
public class VideoUtil
{
	/**
	 * 視頻轉碼函數(僅轉碼)
	 * 
	 * @param inputfile  原始視頻文件完整路徑
	 * @param outputfile 目標視頻文件完整保存路徑(必須完整文件名,即包含格式后綴,推薦格式后綴為.mp4)
	 * @throws Exception 異常
	 */
	public static void videoConvert(String inputfile, String outputfile) throws Exception
	{
		if (outputfile.lastIndexOf('.') < 0)
		{
			throw new Exception("Error! Output file format undetected!");
		}
		String format = outputfile.substring(outputfile.lastIndexOf('.'));

		FFmpegLogCallback.set();
		Frame frame;
		FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(inputfile);
		FFmpegFrameRecorder recorder = null;

		try
		{
			System.out.println("開始初始化幀抓取器");

			// 初始化幀抓取器,例如數據結構(時間戳、編碼器上下文、幀對象等),
			// 如果入參等于true,還會調用avformat_find_stream_info方法獲取流的信息,放入AVFormatContext類型的成員變量oc中
			grabber.start(true);

			System.out.println("幀抓取器初始化完成");

			// grabber.start方法中,初始化的解碼器信息存在放在grabber的成員變量oc中
			AVFormatContext avformatcontext = grabber.getFormatContext();

			// 文件內有幾個媒體流(一般是視頻流+音頻流)
			int streamNum = avformatcontext.nb_streams();

			// 沒有媒體流就不用繼續(xù)了
			if (streamNum < 1)
			{
				System.out.println("文件內不存在媒體流");
				throw new Exception("Error! There is no media stream in the file!");
			}

			// 取得視頻的幀率
			double framerate = grabber.getVideoFrameRate();

			System.out.printf("視頻幀率[%f],視頻時長[%d]秒,媒體流數量[%d]\r\n", framerate, avformatcontext.duration() / 1000000,
					avformatcontext.nb_streams());

			// 遍歷每一個流,檢查其類型
			for (int i = 0; i < streamNum; i++)
			{
				AVStream avstream = avformatcontext.streams(i);
				AVCodecParameters avcodecparameters = avstream.codecpar();
				System.out.printf("流的索引[%d],編碼器類型[%d],編碼器ID[%d]\r\n", i, avcodecparameters.codec_type(),
						avcodecparameters.codec_id());
			}

			// 視頻寬度
			int frameWidth = grabber.getImageWidth();
			// 視頻高度
			int frameHeight = grabber.getImageHeight();
			// 音頻通道數量
			int audiochannels = grabber.getAudioChannels();

			System.out.printf("視頻寬度[%d],視頻高度[%d],音頻通道數[%d]\r\n", frameWidth, frameHeight, audiochannels);

			recorder = new FFmpegFrameRecorder(outputfile, frameWidth, frameHeight, audiochannels);
			recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);

			recorder.setFormat(format);
			// 使用原始視頻的碼率,若需要則自行修改碼率
			recorder.setVideoBitrate(grabber.getVideoBitrate());
			
			// 一秒內的幀數,幀率
			recorder.setFrameRate(framerate);

			// 兩個關鍵幀之間的幀數
			recorder.setGopSize((int)framerate);

			// 設置音頻通道數,與視頻源的通道數相等
			recorder.setAudioChannels(grabber.getAudioChannels());

			recorder.start();

			int videoframenum = 0;
			int audioframenum = 0;
			int dataframenum = 0;

			// 持續(xù)從視頻源取幀
			while (null != (frame = grabber.grab()))
			{
				// 有圖像,就把視頻幀加一
				if (null != frame.image)
				{
					videoframenum++;
					// 取出的每一幀,都保存到視頻
					recorder.record(frame);
				}

				// 有聲音,就把音頻幀加一
				if (null != frame.samples)
				{
					audioframenum++;
					// 取出的每一幀,都保存到視頻
					recorder.record(frame);
				}

				// 有數據,就把數據幀加一
				if (null != frame.data)
				{
					dataframenum++;
				}
			}

			System.out.printf("轉碼完成,視頻幀[%d],音頻幀[%d],數據幀[%d]\r\n", videoframenum, audioframenum, dataframenum);

		} catch (Exception e)
		{
			// e.printStackTrace();
			throw e;
		} finally
		{
			if (recorder != null)
			{
				try
				{
					recorder.close();
				} catch (Exception e)
				{
					// System.out.println("recorder.close異常" + e);
					throw e;
				}
			}

			try
			{
				grabber.close();
			} catch (FrameGrabber.Exception e)
			{
				// System.out.println("frameGrabber.close異常" + e);
				throw e;
			}
		}
	}
}

測試類

/**
 * 測試類
 * 
 * @author alderaan
 * @version 創(chuàng)建時間:2022年5月10日 下午3:47:49
 *
 */
public class App
{
	public static void main(String[] args)
	{
		try
		{
			// videoConvert函數,根據outputfile的格式后綴設置轉碼后的視頻格式,推薦使用mp4格式后綴
			VideoUtil.videoConvert("/home/alderaan/test.MOV", "/result.mp4");
		} catch (java.lang.Exception e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("執(zhí)行完畢!");
	}
}

POM

		<!-- Linux x86_64 使用 -->
		<dependency>
			<groupId>org.bytedeco</groupId>
			<artifactId>javacpp</artifactId>
			<version>1.5.7</version>
		</dependency>
		<dependency>
			<groupId>org.bytedeco</groupId>
			<artifactId>opencv</artifactId>
			<version>4.5.5-1.5.7</version>
			<classifier>linux-x86_64-gpu</classifier>
		</dependency>
		<dependency>
			<groupId>org.bytedeco</groupId>
			<artifactId>openblas</artifactId>
			<version>0.3.19-1.5.7</version>
			<classifier>linux-x86_64</classifier>
		</dependency>
		<dependency>
			<groupId>org.bytedeco</groupId>
			<artifactId>ffmpeg</artifactId>
			<version>5.0-1.5.7</version>
			<classifier>linux-x86_64-gpl</classifier>
		</dependency>
		<!-- Windows x86_64 使用 -->
		<dependency>
			<groupId>org.bytedeco</groupId>
			<artifactId>opencv</artifactId>
			<version>4.5.5-1.5.7</version>
			<classifier>windows-x86_64</classifier>
		</dependency>
		<dependency>
			<groupId>org.bytedeco</groupId>
			<artifactId>openblas</artifactId>
			<version>0.3.19-1.5.7</version>
			<classifier>windows-x86_64</classifier>
		</dependency>
		<dependency>
			<groupId>org.bytedeco</groupId>
			<artifactId>ffmpeg</artifactId>
			<version>5.0-1.5.7</version>
			<classifier>windows-x86_64</classifier>
		</dependency>

文章來源地址http://www.zghlxwxcb.cn/news/detail-589353.html

到了這里,關于JavaCV:將任意視頻轉碼為h264編碼的mp4格式視頻的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

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

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

相關文章

  • python ffmpeg將mp4文件實時轉碼為ts,并指定pid等信息,輸出到udp

    要將MP4文件實時轉碼為TS格式,并將PID等信息指定為UDP輸出,可以使用 subprocess 模塊和ffmpeg命令行工具來實現(xiàn)。以下是一個示例代碼,用于實時轉碼并將輸出發(fā)送到UDP服務器: 在上述代碼中,我們首先定義了輸入文件、UDP服務器地址和PID等信息。然后,我們使用 subprocess.Pop

    2024年01月22日
    瀏覽(35)
  • 9i物聯(lián)網瀏覽器(cef_114.2.120&114.2.100,支持H264視頻mp3,mp4)WinForm-CefSharp(5735分支)多媒體版本體驗

    9i物聯(lián)網瀏覽器(cef_114.2.120&114.2.100,支持H264視頻mp3,mp4)WinForm-CefSharp(5735分支)多媒體版本體驗

    更新:2023.6.25 版本: Cef_114.2.110和114.2.100 +chromium- 114.0.5735.134 的32位和64位 說明:支持圖片,mp3,mp4(H264)多媒體 測試環(huán)境:windows server 2019(其他環(huán)境沒測,一般問題.NET4.5.2+及vc++運行庫問題) 測試網址:www.html5test.com 聲明 :本博是交流學習的內容,應用案例定制版瀏覽器

    2024年02月16日
    瀏覽(22)
  • [解決思路]關于h264裸流合成mp4時時間戳添加問題

    ????????使用GPU編碼(Opencv)生成的h264視頻片段中不包含時間戳信息,且含有B幀,直接合成mp4后會導致播放出現(xiàn)問題(瞬間播放完成)。因此,在合成時需要手動添加時間戳。 ? ? ? ? 發(fā)現(xiàn)生成的視頻會 瞬間播放完成 后,意識到是時間戳的問題,檢查時間戳代碼: ? ? ? ?

    2024年01月21日
    瀏覽(38)
  • JAVA實現(xiàn)H264視頻流推送到RTSP、RTMP服務----JavaCV

    前提: 1.準備好rtsp、rtmp服務 2.準備好視頻流接收程序 基本思路是:啟動兩個線程,線程1接收視頻流,線程2使用JavaCV將視頻流推送到RTSP、RTMP服務,兩者之間使用管道流進行通信。線程2接收到視頻流后的具體操作:啟動grabber接收視頻流并捕獲視頻幀,然后啟動recoder將捕獲的

    2024年02月11日
    瀏覽(31)
  • 視頻編碼(H264編碼)

    基本步驟: ?? 1、打開編碼器 ??????? ?2、轉換NV12到YUV420,這是因為FFmpeg的x264編碼器只支持YUV420 ??????? ?3、準備編碼數據AVFrame ? ? ? ? 創(chuàng)建frame: ?創(chuàng)建AVPacket: AVPacket* pck = av_packet_alloc(); 4、H264編碼 ?? ? ?avcodec_send_frame(#AVCodecContext *avctx#, #const AVFrame *frame#) ? ?

    2024年02月03日
    瀏覽(15)
  • 音視頻——視頻流H264編碼格式

    音視頻——視頻流H264編碼格式

    我們了解了什么是宏快,宏快作為壓縮視頻的最小的一部分,需要被組織,然后在網絡之間做相互傳輸。 H264更深層次 —》宏塊 太淺了 ? 如果單純的用 宏快 來發(fā)送數據是 雜亂無章 的,就好像在沒有 集裝箱 出現(xiàn)之前,貨物總是隨意被堆放到船上。 上貨(編碼),下貨是非

    2024年02月15日
    瀏覽(26)
  • 視頻編碼流程 YUV數據編碼為H264數據

    視頻編碼流程 YUV數據編碼為H264數據

    視頻編碼時,設置編碼器上下文參數有:碼率,寬,高,格式,幀率等 frame設置:寬,高,格式 然后計算一幀的數據:寬 * 高 * 格式占用字節(jié)數 通常使用av_image_get_buffer_size來計算 av_opt_set就是用來設置參數的 preset preset參數是一個權衡編碼速度和壓縮率的參數,編碼速度越慢,壓縮率越高 參數

    2024年02月13日
    瀏覽(21)
  • 視頻一鍵轉碼:批量轉換MP4視頻的技巧

    視頻一鍵轉碼:批量轉換MP4視頻的技巧

    隨著數字媒體設備的普及,視頻文件在生活中扮演著越來越重要的角色。而在處理視頻文件時,有時需要將其轉換為不同的格式以適應不同的需求。其中,MP4格式因其通用性和高質量而備受青睞。本文詳解云炫AI智剪如何一鍵轉碼的技巧,幫助批量轉換MP4視頻。 步驟1、在云炫

    2024年02月22日
    瀏覽(22)
  • 音視頻處理 ffmpeg中級開發(fā) H264編碼

    音視頻處理 ffmpeg中級開發(fā) H264編碼

    libavcodec/avcodec.h 常用的數據結構 AVCodec 編碼器結構體 AVCodecContext 編碼器上下文 AVFrame 解碼后的幀 結構體內存的分配和釋放 av_frame_alloc 申請 av_frame_free() 釋放 avcodec_alloc_context3() 創(chuàng)建編碼器上下文 avcodec_free_context() 釋放編碼器上下文 解碼步驟 avcodec_find_decoder 查找解碼器 avcod

    2024年02月01日
    瀏覽(109)
  • 【解決】螢石云接入視頻報錯視頻編碼類型非H264

    【解決】螢石云接入視頻報錯視頻編碼類型非H264

    說在前面 項目視頻監(jiān)控設備接入了螢石云,部分視頻無法正常加載,報錯頁面如下: 原因分析 視頻監(jiān)控視頻編碼目前有H265和H264兩種,螢石云僅支持H264的編碼格式,所以對于接入的視頻流才會出現(xiàn)這種錯誤。 解決方案 方案一:如果你能接觸到項目部網絡,可以參考螢石云

    2024年02月14日
    瀏覽(79)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領取紅包

二維碼2

領紅包