JeeGit 官方论坛

找回密码
立即注册
搜索
热搜: 活动 交友 discuz
发新帖

1

收听

0

听众

196

主题
发表于 2024-3-19 16:28:04 | 查看: 522| 回复: 22


FFmpeg 转码 分辨率,码率参数 分片



ffmpeg -i input.mp4 \
-s 1920x1080 -b:v 8M -minrate 8M -maxrate 8M -bufsize 16M -c:v libx264 -x264-params "nal-hrd=cbr:no-scenecut=0:min-keyint=1:max-keyint=15" \
-b:a 192K -ar 48000 -ac 2 -c:a aac \
-f hls -hls_time 10 -hls_list_size 0 -hls_wrap 10 output.m3u8




要使用FFmpeg进行转码,并调整分辨率、码率和输出分片,可以使用以下命令行参数。

ffmpeg -i input.mp4 \
-s 1920x1080 -b:v 8M -minrate 8M -maxrate 8M -bufsize 16M -c:v libx264 -x264-params "nal-hrd=cbr:no-scenecut=0:min-keyint=1:max-keyint=15" \
-b:a 192K -ar 48000 -ac 2 -c:a aac \
-f hls -hls_time 10 -hls_list_size 0 -hls_wrap 10 output.m3u8

解释:

-i input.mp4: 输入文件。

-s 1920x1080: 设置目标分辨率为1920x1080。

-b:v 8M: 设置目标视频码率为8Mbps。

-minrate 8M -maxrate 8M: 设置视频码率自适应窗口最小和最大码率为8Mbps。

-bufsize 16M: 设置码率控制缓冲区大小为16Mbps。

-c:v libx264 -x264-params "nal-hrd=cbr:no-scenecut=0:min-keyint=1:max-keyint=15":使用libx264编码器,并设置H.264编码器参数,如CBR模式和键帧间隔。

-b:a 192K: 设置音频码率为192Kbps。

-ar 48000 -ac 2: 设置音频采样率为48000Hz和声道数为2。

-c:a aac: 使用AAC算法压缩音频。

-f hls: 输出格式为HLS。

-hls_time 10: 每个分片的持续时间为10秒。

-hls_list_size 0: 播放列表中保存的分片数量无限制。

-hls_wrap 10: 当达到这个数量的分片时,开始覆盖旧的分片。

output.m3u8: 输出的HLS播放列表文件。

请根据实际需求调整分辨率、码率和HLS参数。

发表于 2024-3-21 14:58:20
https://www.cnblogs.com/zhaoguan_wang/p/3534860.html

System.AccessViolationException: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
Posted on 2014-01-27 14:37  召冠  阅读(14263)  评论(1)  编辑  收藏  举报
系统debug时出现错误,System.AccessViolationException: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。

Attempted to read or write protected memory. This is often an indication that other memory is corrupt



从网上查阅,大多都是说因为调用C++等dll等等,但系统中确实没有关于其他dll的调用,很是郁闷。最后查得设置配置参数即可。

解决办法:

Tools menu ->Options -> Debugging -> General -> Uncheck this option "Suppress JIT optimization on module load"



回复 显示全部楼层 道具 举报

发表于 2024-3-21 13:49:05
在使用FFmpeg进行视频处理时,优化速度通常涉及到调整编解码器选择、比特率、分辨率,以及CPU资源的利用。以下是一些基本的优化建议:

选择更快的编解码器:对于某些特定的输出格式或编解码器,可能存在更快的替代编解码器。例如,对于视频压缩H.264,你可以选择更快但输出文件较大的ABR (平均比特率) 编解码器,如CPU特定的H.264 preset(如veryfast或superfast)。

调整比特率:降低比特率可以减少编码过程所需的CPU资源,但会影响输出视频的质量。

降低分辨率:降低视频分辨率可以减少编码工作量,但会影响图像质量。

使用多线程:FFmpeg可以利用多核处理器的所有核心来加速编解码过程。使用-threads选项来指定线程数。

下面是一个简单的FFmpeg命令行示例,它演示了如何使用更快的编解码器和多线程:

bash
ffmpeg -i input.mp4 -c:v libx264raspberry -preset veryfast -maxrate 2000k -bufsize 2000k -c:a copy -threads 4 output.mp4

在这个例子中,我们使用了libx264编解码器,raspberry预设(提供非常快的编码速度),并开启了4个线程来加速处理过程。

请根据具体情况调整这些参数,以达到最佳的性能与质量平衡。

回复 显示全部楼层 道具 举报

发表于 2024-3-21 13:37:13
ffmpeg官网下载编译好的ffmpeg-master-latest-win64-gpl-shared.zip,解压即可使用,并把程序路径写入环境变量Path。

看好要裁剪的视频的开始和结束时间,写入命令行:

ffmpeg -ss 00:25:49 -to 00:26:19 -i https://v26-default.ixigua.com/8 ... 087/?filename=1.mp4 -c copy a.mp4

优点:无需下载整个视频,原始格式,无水印,CPU占用低,速度快。

合并视频音频
ffmpeg -i 1.mp4 -i 1.m4a -c copy a.mp4
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/sonichty/article/details/124662565

回复 显示全部楼层 道具 举报

发表于 2024-3-21 12:10:50

回复 显示全部楼层 道具 举报

发表于 2024-3-21 11:55:21
Control.CheckForIllegalCrossThreadCalls = false

回复 显示全部楼层 道具 举报

发表于 2024-3-21 11:55:04
https://zhuanlan.zhihu.com/p/568602274

不同间线程访问解决方案。

回复 显示全部楼层 道具 举报

发表于 2024-3-21 11:40:20
  1. using System;
  2. using System.Diagnostics;
  3. using System.Threading;
  4. using System.Threading.Tasks;

  5. class Program
  6. {
  7.     static void Main(string[] args)
  8.     {
  9.         var tasks = new Task[3];
  10.         for (int i = 0; i < tasks.Length; i++)
  11.         {
  12.             int taskId = i;
  13.             tasks[i] = Task.Run(() => ExecuteCommand(taskId));
  14.         }

  15.         Task.WaitAll(tasks);
  16.         Console.WriteLine("All commands have been executed.");
  17.     }

  18.     static void ExecuteCommand(int taskId)
  19.     {
  20.         ProcessStartInfo startInfo = new ProcessStartInfo
  21.         {
  22.             FileName = "cmd.exe",
  23.             RedirectStandardInput = true,
  24.             RedirectStandardOutput = true,
  25.             UseShellExecute = false,
  26.             CreateNoWindow = true
  27.         };

  28.         using (Process process = Process.Start(startInfo))
  29.         {
  30.             using (var sw = process.StandardInput)
  31.             {
  32.                 if (sw.BaseStream.CanWrite)
  33.                 {
  34.                     sw.WriteLine($"echo Command {taskId}");
  35.                     sw.WriteLine("exit");
  36.                 }
  37.             }

  38.             while (!process.StandardOutput.EndOfStream)
  39.             {
  40.                 string result = process.StandardOutput.ReadToEnd();
  41.                 Console.WriteLine($"Task {taskId}: {result}");
  42.             }
  43.         }
  44.     }
  45. }
复制代码




c# 多线程操作 process 执行命令
在C#中,可以使用System.Diagnostics.Process类来启动一个新的进程并与之交互,包括在多线程环境中执行命令。以下是一个简单的示例,展示了如何在多线程环境中使用Process类来启动多个命令:
这段代码中,我们定义了一个ExecuteCommand方法,它启动一个新的cmd.exe进程,并通过标准输入发送命令。每个命令都会打印出Task ID,然后通过标准输出读取并打印结果。在Main方法中,我们创建了三个并行运行的任务,每个任务都使用不同的taskId调用ExecuteCommand方法。

请注意,在实际应用中,你可能需要添加更多的错误处理和同步机制来确保程序的健壮性和线程安全。

回复 显示全部楼层 道具 举报

发表于 2024-3-21 10:48:02

回复 显示全部楼层 道具 举报

发表于 2024-3-21 09:26:28
  1. 好的,我将展示如何在C#中执行FFmpeg命令,并监听回调信息,包括失败和成功事件。下面是一个完整的示例代码:

  2. ```csharp
  3. using System;
  4. using System.Diagnostics;
  5. using System.IO;

  6. namespace FFmpegExample
  7. {
  8.     class Program
  9.     {
  10.         static void Main(string[] args)
  11.         {
  12.             string inputFile = "input.mp4";
  13.             string outputFile = "output.mp4";
  14.             string ffmpegPath = "path/to/ffmpeg";

  15.             ExecuteFFmpegCommand(ffmpegPath, inputFile, outputFile);
  16.         }

  17.         static void ExecuteFFmpegCommand(string ffmpegPath, string inputFile, string outputFile)
  18.         {
  19.             try
  20.             {
  21.                 string arguments = $"-i "{inputFile}" -c:v libx264 -crf 23 "{outputFile}"";

  22.                 using (Process process = new Process())
  23.                 {
  24.                     process.StartInfo.FileName = ffmpegPath;
  25.                     process.StartInfo.Arguments = arguments;
  26.                     process.StartInfo.UseShellExecute = false;
  27.                     process.StartInfo.RedirectStandardOutput = true;
  28.                     process.StartInfo.RedirectStandardError = true;

  29.                     process.OutputDataReceived += Process_OutputDataReceived;
  30.                     process.ErrorDataReceived += Process_ErrorDataReceived;

  31.                     process.Start();
  32.                     process.BeginOutputReadLine();
  33.                     process.BeginErrorReadLine();

  34.                     process.WaitForExit();

  35.                     if (process.ExitCode == 0)
  36.                     {
  37.                         Console.WriteLine("FFmpeg命令执行成功!");
  38.                     }
  39.                     else
  40.                     {
  41.                         Console.WriteLine($"FFmpeg命令执行失败,退出代码:{process.ExitCode}");
  42.                     }
  43.                 }
  44.             }
  45.             catch (Exception ex)
  46.             {
  47.                 Console.WriteLine($"发生异常:{ex.Message}");
  48.             }
  49.         }

  50.         private static void Process_OutputDataReceived(object sender, DataReceivedEventArgs e)
  51.         {
  52.             if (!string.IsNullOrWhiteSpace(e.Data))
  53.             {
  54.                 Console.WriteLine(e.Data);
  55.             }
  56.         }

  57.         private static void Process_ErrorDataReceived(object sender, DataReceivedEventArgs e)
  58.         {
  59.             if (!string.IsNullOrWhiteSpace(e.Data))
  60.             {
  61.                 Console.WriteLine(e.Data);
  62.             }
  63.         }
  64.     }
  65. }
  66. ```

  67. 在上面的代码中,我们定义了一个`ExecuteFFmpegCommand`方法,用于执行FFmpeg命令。这个方法接收三个参数:FFmpeg的路径,输入文件和输出文件。

  68. 在`ExecuteFFmpegCommand`方法内部,我们首先构建FFmpeg命令行参数,然后创建一个新的`Process`对象。我们设置了`StartInfo`属性,包括FFmpeg的路径和命令行参数,并启用了重定向标准输出和错误输出。

  69. 接下来,我们为`Process`对象的`OutputDataReceived`和`ErrorDataReceived`事件绑定了事件处理程序。这两个事件分别用于捕获FFmpeg的标准输出和错误输出。在事件处理程序中,我们将输出信息直接写入控制台。

  70. 然后,我们调用`Process.Start()`启动FFmpeg进程,并调用`BeginOutputReadLine`和`BeginErrorReadLine`方法开始异步读取输出和错误信息。

  71. 最后,我们等待FFmpeg进程退出,并根据退出代码判断命令是否执行成功。

  72. 在这个示例中,我们监听了FFmpeg的标准输出和错误输出,并将它们打印到控制台。你可以根据实际需求,在事件处理程序中进行其他操作,例如记录日志、发送通知等。

  73. 需要注意的是,你需要确保FFmpeg可执行文件存在于指定的路径,并且输入文件也存在。否则,FFmpeg命令将无法正确执行。
复制代码

回复 显示全部楼层 道具 举报

您需要登录后才可以回帖 登录 | 立即注册

QQ|Archiver|手机版|小黑屋|JeeGit 官方论坛 ( 吉ICP备19001578号-2|吉B2-20200006 )

GMT+8, 2024-5-20 11:05 , Processed in 0.025230 second(s), 19 queries .

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

快速回复 返回顶部 返回列表