private void SendVideoInternal(TLMessage message, CompressingVideoFile file) { if (file.IsCompressionEnabled) { message.Status = MessageStatus.Compressing; GetCompressedFile(file, (compressedFile, compressedSize) => { message.Media.IsoFileName = compressedFile.Path; message.Media.File = compressedFile; message.Status = MessageStatus.Sending; var mediaVideo = message.Media as TLMessageMediaVideo; if (mediaVideo != null) { var video = mediaVideo.Video as TLVideo; if (video != null) { video.Size = new TLInt((int)compressedSize); SendCompressedVideoInternal(message, compressedFile); } } }, error => { message.Status = MessageStatus.Failed; }); } else { SendCompressedVideoInternal(message, file.Source); } }
private static async void GetCompressedFile(CompressingVideoFile file, Action <StorageFile, ulong> callback, Action <double> progressCallback, Action <IAsyncActionWithProgress <double> > faultCallback) { var fileName = Path.GetFileName(file.Source.Name); var videoParameters = string.Empty; if (file.EncodingProfile != null) { videoParameters = string.Format("{0}_{1}_{2}_{3}", file.EncodingProfile.Video.Width, file.EncodingProfile.Video.Height, file.EncodingProfile.Video.Bitrate, file.EncodingProfile.Video.FrameRate); } var audioParameters = string.Empty; if (file.EncodingProfile != null) { audioParameters = file.EncodingProfile.Audio != null?file.EncodingProfile.Audio.Bitrate.ToString() : "0"; } var hashString = string.Format("{0}_{1}_{2}_{3}", audioParameters, videoParameters, file.TrimStartTime, file.TrimStopTime); var transcodedFileName = string.Format("vid_{0}_{1}", hashString.GetHashCode(), fileName); //Telegram.Api.Helpers.Execute.ShowDebugMessage(transcodedFileName + Environment.NewLine + hashString); var fulltranscodedFileName = Path.Combine(KnownFolders.CameraRoll.Path, transcodedFileName); if (File.Exists(fulltranscodedFileName)) { StorageFile transcodedFile = null; ulong transcodedLength = 0; try { transcodedFile = await KnownFolders.CameraRoll.GetFileAsync(transcodedFileName); if (transcodedFile != null) { transcodedLength = (ulong)new FileInfo(fulltranscodedFileName).Length; } } catch (Exception ex) { Telegram.Api.Helpers.Execute.ShowDebugMessage("Get transcoded file ex: \n" + ex); } if (transcodedFile != null && transcodedLength > 0) { callback.SafeInvoke(transcodedFile, transcodedLength); return; } } var dest = await KnownFolders.CameraRoll.CreateFileAsync(transcodedFileName, CreationCollisionOption.ReplaceExisting); TranscodeFile(file.EncodingProfile, file.TrimStartTime, file.TrimStopTime, file.Source, dest, callback, progressCallback, faultCallback); }
private static async void GetCompressedFile(CompressingVideoFile file, Action <StorageFile, ulong> callback, Action <IAsyncActionWithProgress <double> > faultCallback) { //Compression here var fileName = Path.GetFileName(file.Source.Name); var transcodedFileName = "vid_" + fileName; var fulltranscodedFileName = Path.Combine(KnownFolders.CameraRoll.Path, transcodedFileName); if (File.Exists(fulltranscodedFileName)) { StorageFile transcodedFile = null; ulong transcodedLength = 0; try { transcodedFile = await KnownFolders.CameraRoll.GetFileAsync(transcodedFileName); if (transcodedFile != null) { transcodedLength = (ulong)new FileInfo(fulltranscodedFileName).Length; } } catch (Exception ex) { Telegram.Api.Helpers.Execute.ShowDebugMessage("Get transcoded file ex: \n" + ex); } if (transcodedFile != null && transcodedLength > 0) { callback.SafeInvoke(transcodedFile, transcodedLength); return; } } var dest = await KnownFolders.CameraRoll.CreateFileAsync(transcodedFileName, CreationCollisionOption.ReplaceExisting); TranscodeFile(VideoEncodingQuality.Vga, file.Source, dest, callback, faultCallback); }
private void SendVideoInternal(TLMessage message, CompressingVideoFile file) { if (file.EncodingProfile != null || file.TrimStartTime.Ticks > 0 || file.TrimStopTime.Ticks > 0) { message.Status = MessageStatus.Compressing; message.Media.UploadingProgress = 0.001; message.Media.CompressingProgress = 0.0; GetCompressedFile( file, async(compressedFile, compressedSize) => { if (message.Status == MessageStatus.Failed) { return; } //var videoProperties = await file.Source.Properties.GetVideoPropertiesAsync(); //var videoProperties2 = await compressedFile.Properties.GetVideoPropertiesAsync(); message.Media.IsoFileName = compressedFile.Path; message.Media.File = compressedFile; message.Media.CompressingProgress = 0.0; message.Status = MessageStatus.Sending; var mediaDocument = message.Media as TLMessageMediaDocument45; if (mediaDocument != null) { var document = mediaDocument.Document as TLDocument; if (document != null) { if (file.EncodingProfile != null && file.EncodingProfile.Audio == null && compressedSize < Telegram.Api.Constants.GifMaxSize) { // copy to local storage var localFile = await compressedFile.CopyAsync(ApplicationData.Current.LocalFolder, document.GetFileName(), NameCollisionOption.ReplaceExisting); message.Media.IsoFileName = localFile.Path; message.Media.File = localFile; } document.Size = new TLInt((int)compressedSize); SendCompressedVideoInternal(message, compressedFile); } } var mediaVideo = message.Media as TLMessageMediaVideo; if (mediaVideo != null) { var video = mediaVideo.Video as TLVideo; if (video != null) { video.Size = new TLInt((int)compressedSize); SendCompressedVideoInternal(message, compressedFile); } } }, progress => { message.Media.CompressingProgress = progress / 100.0; }, error => { message.Status = MessageStatus.Failed; message.Media.CompressingProgress = 0.0; }); } else { SendCompressedVideoInternal(message, file.Source); } }
public void ContinueSendVideo(CompressingVideoFile videoFile) { if (videoFile == null) { return; } var file = videoFile.Source; if (file == null) { return; } if (!CheckDocumentSize(videoFile.Size)) { MessageBox.Show( string.Format(AppResources.MaximumFileSizeExceeded, MediaSizeConverter.Convert((int)Telegram.Api.Constants.MaximumUploadedFileSize)), AppResources.Error, MessageBoxButton.OK); return; } // to get access to the file with StorageFile.GetFileFromPathAsync in future AddFileToFutureAccessList(file); var documentAttributeVideo = new TLDocumentAttributeVideo { Duration = new TLInt((int)videoFile.Duration), W = new TLInt((int)videoFile.Width), H = new TLInt((int)videoFile.Height) }; var documentAttributeFileName = new TLDocumentAttributeFileName { FileName = new TLString(file.Name) }; var document = new TLDocument54 { Id = TLLong.Random(), AccessHash = new TLLong(0), Date = TLUtils.DateToUniversalTimeTLInt(MTProtoService.ClientTicksDelta, DateTime.Now), MimeType = new TLString(file.ContentType), Size = new TLInt((int)videoFile.Size), Thumb = videoFile.ThumbPhoto ?? new TLPhotoSizeEmpty { Type = TLString.Empty }, DCId = new TLInt(0), Version = new TLInt(0), Attributes = new TLVector <TLDocumentAttributeBase> { documentAttributeFileName, documentAttributeVideo } }; if (videoFile.EncodingProfile != null && videoFile.EncodingProfile.Audio == null && videoFile.Size < Telegram.Api.Constants.GifMaxSize && TLString.Equals(document.MimeType, new TLString("video/mp4"), StringComparison.OrdinalIgnoreCase)) { document.Attributes.Add(new TLDocumentAttributeAnimated()); } var media = new TLMessageMediaDocument75 { Flags = new TLInt(0), Document = document, IsoFileName = file.Path, File = file, Caption = TLString.Empty }; var caption = string.IsNullOrEmpty(videoFile.Caption) ? TLString.Empty : new TLString(videoFile.Caption); var message = GetMessage(caption, media); if (videoFile.TimerSpan != null && videoFile.TimerSpan.Seconds > 0) { message.NotListened = true; var ttlMessageMedia = message.Media as ITTLMessageMedia; if (ttlMessageMedia != null) { ttlMessageMedia.TTLSeconds = new TLInt(videoFile.TimerSpan.Seconds); } } _mentions = videoFile.Mentions; var processedText = string.Empty; var entities = GetEntities(message.Message.ToString(), out processedText); _mentions = null; if (entities.Count > 0) { message.Message = new TLString(processedText); message.Entities = new TLVector <TLMessageEntityBase>(entities); } BeginOnUIThread(() => { var previousMessage = InsertSendingMessage(message); IsEmptyDialog = Items.Count == 0 && (_messages == null || _messages.Count == 0) && LazyItems.Count == 0; BeginOnThreadPool(() => CacheService.SyncSendingMessage( message, previousMessage, m => SendVideoInternal(message, videoFile))); }); }
public void SendVideo(CompressingVideoFile videoFile) { if (videoFile == null) { return; } var file = videoFile.Source; if (file == null) { return; } if (!CheckDocumentSize(videoFile.Size)) { MessageBox.Show( string.Format(AppResources.MaximumFileSizeExceeded, MediaSizeConverter.Convert((int)Telegram.Api.Constants.MaximumUploadedFileSize)), AppResources.Error, MessageBoxButton.OK); return; } // to get access to the file with StorageFile.GetFileFromPathAsync in future AddFileToFutureAccessList(file); var video = new TLVideo { Id = new TLLong(0), Caption = new TLString(Path.GetFileName(file.Name)), AccessHash = new TLLong(0), Date = TLUtils.DateToUniversalTimeTLInt(MTProtoService.ClientTicksDelta, DateTime.Now), UserId = new TLInt(StateService.CurrentUserId), Duration = new TLInt((int)videoFile.Duration), MimeType = new TLString(file.ContentType), Size = new TLInt((int)videoFile.Size), Thumb = videoFile.ThumbPhoto ?? new TLPhotoSizeEmpty { Type = TLString.Empty }, DCId = new TLInt(0), W = new TLInt((int)videoFile.Width), H = new TLInt((int)videoFile.Height) }; var media = new TLMessageMediaVideo28 { Video = video, IsoFileName = file.Path, File = file, Caption = TLString.Empty }; var message = GetMessage(TLString.Empty, media); BeginOnUIThread(() => { var previousMessage = InsertSendingMessage(message); IsEmptyDialog = Items.Count == 0 && LazyItems.Count == 0; BeginOnThreadPool(() => CacheService.SyncSendingMessage( message, previousMessage, TLUtils.InputPeerToPeer(Peer, StateService.CurrentUserId), m => SendVideoInternal(message, videoFile))); }); }