我有2个.webm文件,一个包含视频,另一个包含音频。我需要生成包含视频和音频的单个mp4文件,同步。这是我尝试做的事情:
ffmpeg -ss 00:00:00.33 -i user_17624_1-1762.webm -an -r 15 -f rawvideo -pix_fmt yuv420p -s 1920x1080 ./video.pipe &
ffmpeg -i user_17624_2-1767.webm -vn -ar 44100 -ac 2 -f s16le -acodec pcm_s16le ./audio.pipe &
ffmpeg -an -r 15 -f rawvideo -pix_fmt yuv420p -s 1920x1080 -i ./video.pipe -vn -ar 44100 -ac 2 -f s16le -acodec pcm_s16le -i ./audio.pipe -r 15 output_bad.mp4
-ss by 0.33s是因为视频在音频开始前0.33s开始 - 1762和1767是帧数,所以它们是5帧关闭,15 fs。
这样做,我得到了一个完美的录音,其中视频和音频在整个文件中同步。
但问题是,我需要做一些视频帧的改动,我这样做是一个C应用程序操纵原始视频流中的字节,所以我不能这样做,我需要转码先RAW然后操作,然后从原始编码mp4。从链中删除我的C应用程序以确保它不是问题,它归结为:
public class Program
{
static bool RedirectionCallback(string url)
{
return url.ToLower().StartsWith("computername.domain.contoso.com/EWS/Exchange.asmx");
}
static void Main(string[] args)
{
ExchangeService myService = new ExchangeService(ExchangeVersion.Exchange2007_SP1);
myService.Credentials = new NetworkCredential("abc@org.com", "password", "domain");
myService.AutodiscoverUrl("abc@org.com", RedirectionCallback);
Console.WriteLine("EWS Endpoint: {0}", myService.Url);
Folder inbox = Folder.Bind(myService, WellKnownFolderName.Inbox);
Console.WriteLine("The folder name is " + inbox.DisplayName.ToString());
Console.WriteLine("EWS Endpoint: {0}", myService.Url);
FindItemsResults<Item> findResults = myService.FindItems(WellKnownFolderName.Inbox, new ItemView(10));
string content = string.Empty;
foreach (Item item in findResults.Items)
{
EmailMessage email = EmailMessage.Bind(myService, item.Id);
email.Load();
content += item.Subject + "\n";
content += email.From.Address + "\n";
content += email.Body + "\n\n";
Console.WriteLine(item.Subject);
Console.WriteLine(email.From.Address);
Console.WriteLine(email.Body);
}
string result = content;
}
结果是,记录音频和视频彼此偏离,并且似乎也在文件持续时间内波动。
我对这些视频转码做错了什么?请帮帮我:)。
米哈伊尔
答案 0 :(得分:0)
答案证明很简单,-async 10000
答案 1 :(得分:0)
当我将视频像素格式更改为yuv420时,我也遇到了类似的问题,但是当我提高帧率时,问题就解决了
您可以通过增加fps来尝试: -framerate 120