Skip to content

Commit

Permalink
utils/ffmpeg: integrate merge functions into a file [ci skip]
Browse files Browse the repository at this point in the history
  • Loading branch information
iawia002 committed Aug 10, 2018
1 parent d8545e5 commit fda746c
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 39 deletions.
45 changes: 6 additions & 39 deletions downloader/downloader.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,11 @@ package downloader

import (
"bufio"
"bytes"
"encoding/json"
"fmt"
"io"
"log"
"os"
"os/exec"
"sort"
"strings"
"time"
Expand Down Expand Up @@ -320,45 +318,14 @@ func (v VideoData) Download(refer string) {
return
}
// merge
mergeFileName := title + ".txt" // merge list file should be in the current directory
filePath := utils.FilePath(title, "mp4", false)
fmt.Printf("Merging video parts into %s\n", filePath)
var cmd *exec.Cmd
if strings.Contains(v.Site, "youtube") {
// merge audio and video
cmds := []string{
"-y",
}
for _, part := range parts {
cmds = append(cmds, "-i", part)
}
cmds = append(
cmds, "-c:v", "copy", "-c:a", "aac", "-strict", "experimental",
filePath,
)
cmd = exec.Command("ffmpeg", cmds...)
fmt.Printf("Merging video parts into %s\n", mergedFilePath)
var err error
if v.Site == "YouTube youtube.com" {
err = utils.MergeAudioAndVideo(parts, mergedFilePath)
} else {
// write ffmpeg input file list
mergeFile, _ := os.Create(mergeFileName)
for _, part := range parts {
mergeFile.Write([]byte(fmt.Sprintf("file '%s'\n", part)))
}
mergeFile.Close()

cmd = exec.Command(
"ffmpeg", "-y", "-f", "concat", "-safe", "-1",
"-i", mergeFileName, "-c", "copy", "-bsf:a", "aac_adtstoasc", filePath,
)
err = utils.MergeToMP4(parts, mergedFilePath, title)
}
var stderr bytes.Buffer
cmd.Stderr = &stderr
err := cmd.Run()
if err != nil {
log.Fatal(fmt.Sprint(err) + "\n" + stderr.String())
}
// remove parts
os.Remove(mergeFileName)
for _, part := range parts {
os.Remove(part)
log.Println(err)
}
}
59 changes: 59 additions & 0 deletions utils/ffmpeg.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package utils

import (
"bytes"
"fmt"
"os"
"os/exec"
)

func runMergeCmd(cmd *exec.Cmd, paths []string, mergeFilePath string) error {
var stderr bytes.Buffer
cmd.Stderr = &stderr
err := cmd.Run()
if err != nil {
return fmt.Errorf("%s\n%s", err, stderr.String())
}

if mergeFilePath != "" {
os.Remove(mergeFilePath)
}
// remove parts
for _, path := range paths {
os.Remove(path)
}
return nil
}

// MergeAudioAndVideo merge audio and video
func MergeAudioAndVideo(paths []string, mergedFilePath string) error {
cmds := []string{
"-y",
}
for _, path := range paths {
cmds = append(cmds, "-i", path)
}
cmds = append(
cmds, "-c:v", "copy", "-c:a", "aac", "-strict", "experimental",
mergedFilePath,
)
return runMergeCmd(exec.Command("ffmpeg", cmds...), paths, "")
}

// MergeToMP4 merge video parts to MP4
func MergeToMP4(paths []string, mergedFilePath string, filename string) error {
mergeFilePath := filename + ".txt" // merge list file should be in the current directory

// write ffmpeg input file list
mergeFile, _ := os.Create(mergeFilePath)
for _, path := range paths {
mergeFile.Write([]byte(fmt.Sprintf("file '%s'\n", path)))
}
mergeFile.Close()

cmd := exec.Command(
"ffmpeg", "-y", "-f", "concat", "-safe", "-1",
"-i", mergeFilePath, "-c", "copy", "-bsf:a", "aac_adtstoasc", mergedFilePath,
)
return runMergeCmd(cmd, paths, mergeFilePath)
}

0 comments on commit fda746c

Please sign in to comment.